2009-11-25 2 views
2

인사말, Linq to Entities를 사용하여 얻은 IQueryable 개체의 Where 절 확장 메서드 내에서 bool 작업을 사용할 때 몇 가지 문제가 있습니다. 첫 번째 예제는 where 절 확장 메서드로 이동해야하는 작업으로 Bool1을 사용하여 작동하는 것을 보여줍니다. 두 번째 예제는 변경 후 작동하지 않는 것입니다. Bool1은 완전히 무시되며 결과에 영향을주지 않습니다.Linq, Extension Method, Lambda Expressions 및 Bool 's

예 1 :

var results = 
    from a in context.aTable1 
    where a.Bool1 == false && a.Bool2 == false 
    select new 
    { 
      Column1 = a.Column1 
      Bool1 = a.Bool1 
      Bool2 = a.Bool2 
    }; 

results.Where(l => l. Column1.Contains(fooString)); 

예 2 :

var results = 
    from a in context.aTable1 
    where a.Bool2 == false 
    select new 
    { 
      Column1 = a.Column1 
      Bool1 = a.Bool1 
      Bool2 = a.Bool2 
    }; 

results.Where(l => l.Bool1 == false); 
results.Where(l => l. Column1.Contains(fooString)); 

이들은 그러나 나는 그들이 내가 뭘하려고 오전 보여 희망, 간단한 예를 통해입니다. 확장 메서드는 다른 메서드에 있으며 원래 쿼리를 만들 때 수행 할 수없는 이유입니다.

results.Where(l => !l.Bool1); 
results.Where(l => l.Bool1.Equals(false)); 

그들은 아무것도 같은 효과를 :

나는 절 곳과 같은 일을하고 다음과 같은 다른 방법을 시도했다.

답변

5

두 번째 및 세 번째 쿼리는 사용자가 아무 것도 지정하지 않았기 때문에 "손실"상태가됩니다. 대신 다음과 같이 시도하십시오.

var results = from a in context.aTable1 
       where !a.Bool2 
       select new 
       { 
        Column1 = a.Column1 
        Bool1 = a.Bool1 
        Bool2 = a.Bool2 
       }; 

results = results.Where(l => !l.Bool1); 
results = results.Where(l => l.Column1.Contains(fooString)); 
+0

DOH !!! 나는 바보 같은 느낌, 나는 그것을 할당 잊어 버린 것을 알지 못했다고 나는 믿을 수 없다. 도움을 주셔서 감사합니다. –

2

검색어 결과를 할당하지 않을 것입니다. Where()을 호출 할 때마다 해당 쿼리의 결과가 반환되며,이 작업을 수행해야합니다. 당신이 비 Bool1 결과에 뭔가를하려는 경우

  • 것은, 당신이 그들을 유지하기 위해 선택할 수 있습니다 귀하의 경우

    , 당신은 (같은 최종 결과를 모두) 몇 가지 옵션이 주위 :

    당신은 Where() 체인 수
    var notBool1 = results.Where(l => !l.Bool1); 
    var query = notBool1.Where(l => l.Column1.Contains(fooString)); 
    
  • 함께 호출

    var query = results.Where(l => !l.Bool1) 
            .Where(l => l.Column1.Contains(fooString)); 
    
  • 이 훨씬에 의해하지만 아마도, 아마도 가장 빠른되지 않습니다 :

    var query = results.Where(l => !lBool1 && l.Column1.Contains(fooString)); 
    
0

에 대한

results.Where(l => l.Bool1 == false && l.Column1.Contains(fooString)); 
0

귀하의 .Where 쿼리 컬렉션을 반환 방법, 그들은했다 컬렉션을 수정하지 마십시오 에 전화했다.

var numbers = new int [] { 1,2,3,4,5,6}; 
numbers.Where(x => x % 2 == 0); // numbers still contains 1,2,3,4,5,6 
var evens = numbers.Where(x => x % 2 == 0); // evens contains 2,4,6, numbers 1,2,3,4,5,6 
numbers = numbers.Where(x => x % 2 == 0); // numbers now contains 2,4,6