Linq Where () 람다 식의 "Or"에 해당


91

Linq에 "... where (a = 1) OR (a = 2)"와 같은 SQL 문자열을 작성하는 데 사용할 수있는 방법이 있습니까?


4
나는 당신이 사용하는 방법을 알고 ||있고 a=a.where(hour=> hour<20); if(weekend) a=a.where(hour=> hour>6);. 더 명확하게 말하고 싶을 수도 있습니다.
Kobi

답변:


189

Where 절 (확장 방법) 내에서 확실히 할 수 있습니다. 하지만 복잡한 쿼리를 동적으로 빌드해야하는 경우 PredicateBuilder를 사용할 수 있습니다 .

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

또는 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 );

이것은 들어오는 매개 변수의 값에 따라 Or를 빌드하는 데 필요했기 때문에 훌륭하게 작동했습니다.
Mark

아주 멋지다. 이것이 표준으로 .NET 내부의 함수로 포함되지 않은 것은 부끄러운 일입니다.
maxp 2013-08-19

1
매우 멋진 구현이지만 언급되지 않았을 수도 있지만 이것은 C # 5+에서만 작동합니다.
Thomas.Donnelly 2015

25

단일 where 절에서 표준 .NET 부울 연산자를 사용할 수 있습니다.

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

19

일반 C #에서와 동일한 연산자를 모두 사용합니다. ===> || "or"&& "and"등

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

1

당신의 .Where()전화 표준 부울 '또는'연산자를 사용합니다 ||.

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

Where 호출이 수행하는 모든 작업은 원하는 항목에 대한 부울 비교이므로 원하는만큼 많은 조건부 논리로 채울 수 있습니다.


0

매개 변수 수를 모르는 경우 다음을 사용할 수 있습니다.

샘플 데이터

var parameters= new List<string>{"a","d"};
var sampledata = new Dictionary<string,string>();
    sampledata["a"] = "A";
    sampledata["b"] = "B";
    sampledata["c"] = "C";
    sampledata["d"] = "D";

암호

var query = sampledata.AsQueryable();
var firstItemKey = sampledata.FirstOrDefault().Key;
var queryresult= sampledata.Where(x => x.Key == firstItemKey).AsQueryable();
foreach (var parameter in parameters.Skip(1))
{
    queryresult=queryresult.Concat(query.Where(x => x.Key == parameter));
}
var result = queryresult.ToList();

-1

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

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

배열의 모든 단어를 컬렉션의 객체와 일치시켜 'and'술어에 대해 동일한 작업을 수행 할 수 있습니다.

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

이 예에서 i는 컬렉션의 각 객체와 연관되고 s는 SearchStrings 배열의 각 문자열과 연관됩니다.


1
'Any'는 EF 공급자에 의해 번역 될 수 없으며 로컬에서 평가되어 전체 테이블 스캔 및 메모리 내 필터링이 수행됩니다.
Wade Bee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.