2010-07-15 4 views
31

이와 같은 linq 쿼리가있는 경우 쿼리에서 결과를 찾지 못하도록 어떻게 확인할 수 있습니까?Linq 결과가 비어있는 경우

var LinqResult = 
    from a in Db.Table 
    where a.Value0 == "ninja" 
    group a by a.Value1 into b 
    select new { Table = b}; 

if(LinqResult.Count() == 0) //? 
{ 

} 
+35

왜 닌자를 찾으려고 귀찮게합니까? 그냥 찾을 수 없다고 가정하십시오. 이제까지. – dlras2

답변

82

당신은 시퀀스가 ​​비어 있는지 여부를 확인하는 방법으로 Count() 방법을 사용하여 피하려고한다. 필 하크 (Phil Haack)는 an excellent article on his blog입니다. 여기서 그는이 반 패턴을 설명합니다.

Count()은 실제로 시퀀스의 모든 요소를 ​​열거해야합니다. 시퀀스가 ​​여러 LINQ 연산에 기반하거나 데이터베이스에서 오는 경우 비용이 많이 듭니다.

Any() 확장 방법을 사용해야합니다. 목록에 하나 이상의 요소가 있는지 만 확인하고 전체 시퀀스는 열거하지 않습니다.

if(!LinqResult.Any()) 
{ 
    // your code 
} 

개인적으로, 나는 또한 Any() 오히려 Count()보다 더 나은의 사용이 사용자의 의도를 표현하고, 리팩토링 또는 미래에 안정적으로 변경 쉽다는 것을 생각한다.

그런데 실제로 원하는 것이 시퀀스의 첫 번째 멤버 일 경우 First() 또는 Single() 연산자를 대신 사용해야합니다.

+1

'.Any()'만'.MoveNext()'를 한 번만 호출한다는 기사의 통찰력에도 불구하고 ReSharper (7)는'.Any()'와 다른 열거 메소드를 사용할 때 가능한 여러 개의 열거에 대해 불평 할 것입니다. 어쩌면 ReSharper가 부정확하거나 과잉 효율을 목표로 삼을 수도 있습니다. –

+0

@CarlG : LINQ 데이터의 모든 소스가 게으른 것이 아니므로 Any Any가 비싸다. (예를 들어,'OrderBy' 결과에서 시간이 절약되지 않습니다) –

15
if(!LinqResult.Any()) //? 
{ 

} 
관련 문제