2010-01-20 2 views
73

"... (a = 1) OR (a = 2)"와 같은 SQL 문자열을 작성할 수있는 방법이 Linq에 있습니까?Linq에서 "또는"와 동일한 의미() λ 식

+3

나는'||'사용법을 알고 있고'a = a.where (hour => hour <20);와 같이 동적 인 것을 원한다고 가정합니다. if (weekend) a = a.where (hour => hour> 6);'. 더 명확하게 말하고 싶을 수도 있습니다 ... – Kobi

답변

154

당신은 Where 절 (확장 메서드) 내에서 그것을 확실히 할 수 있습니다. 복잡한 쿼리를 동적으로 작성해야하는 경우 PredicateBuilder을 사용할 수 있습니다.

var query = collection.Where(c => c.A == 1 || c.B == 2); 

아니면 .Where() 전화에 PredicateBuilder

var predicate = PredicateBuilder.False<Foo>(); 
predicate = predicate.Or(f => f.A == 1); 
if (allowB) 
{ 
    predicate = predicate.Or(f => f.B == 1); 
} 

var query = collection.Where(predicate); 
+0

술어를 잘 사용한다! +1 : –

+0

들어오는 매개 변수의 값에 따라 빌드 할 필요가있는이 기능은 훌륭했습니다. - 멋지다! – dadwithkids

+0

매우 시원합니다. 그 부끄러운이 isnt는 표준으로 .NET 내부의 함수로 포함되어 있지 않습니다. – maxp

20

절 어디 당신은 하나의 표준 .NET 부울 연산자를 사용할 수 있습니다

MyDataSource.Where(data => data.a == 'a' || data.a == 'b') 
+4

나는 이것이 가장 간단하고 간단한 대답이라고 생각합니다. – user1477388

+1

이것은 가장 간단한 대답입니다. – Eranda

16

당신은 모두 같은를 사용 연산자는 정상적인 C#에서와 같이 ===> || 에 대한 "또는"& &에 대한 "와"등

var something = from s in mycollection 
       where s.something == 32 || 
         s.somethingelse == 45 
       select s 
+1

나는이 방법을 선호한다, 그것은 자연스럽게 보인다. – nXqd

1

를 사용하여이 ||, 표준 부울 '또는'연산자를 사용합니다.

var query = items.Where(item => (item == 1 || item == 2)); 

모든 호출은 원하는대로 부울 비교이므로 모든 조건부 논리로 작성할 수 있습니다.

0

이것은 .net에 내장되어 있습니다. 이전에는 그렇지 않은지 확실하지 않습니다. 기존 Linq 질의를 감안할 때 문자열 배열 (SearchStrings)을 취하는 where 절을 추가하고 검색 대상 컬렉션의 개체와 일치하는 항목이 있는지 확인할 수 있습니다. ToLower()를 사용하면 SQL 쿼리에서 대/소문자 구분을 피할 수 있습니다.

query.Where(i => SearchStrings.Any(s => i.ToLower().Contains(s.ToLower())); 

당신은 컬렉션의 객체 배열에있는 모든 단어를 일치하여 '과'술어 같은 일을 할 수 있습니다.

query.Where(i => SearchStrings.All(s => i.ToLower().Contains(s.ToLower())); 

이 예제에서는 컬렉션의 각 개체와 상관 관계가 있고, s는 SearchStrings 배열의 각 문자열과 상관 관계가 있습니다.