2010-07-15 4 views
31

Если у меня есть запрос linq, который выглядит так, как я могу проверить, не было ли результатов, найденных по запросу?Если результат Linq Is Empty

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() как способ проверить, пуст ли последовательность или нет. У Фила Хаака есть an excellent article on his blog, где он обсуждает этот антипаттерн.

Count() должен фактически перечислять все элементы последовательности, что может быть дорогостоящим, если последовательность основана на нескольких операциях LINQ (или происходит из базы данных).

Вместо этого вы должны использовать метод расширения Any(), который пытается только увидеть, есть ли хотя бы один элемент в списке, но не будет перечислять всю последовательность.

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

Лично я также считаю, что использование Any(), а не Count() лучше выражает свое намерение, и легче реорганизовать или надежно измениться в будущем.

Кстати, если то, что вы действительно хотите, является первым (или единственным) членом последовательности, вы должны использовать вместо этого операторы или Single().

+1

Несмотря на понимание статьи, что '.Any()' только вызывает '.MoveNext()' один раз, ReSharper (7) будет жаловаться на возможные множественные перечисления при использовании '.Any()', за которым следуют другие методы перечисления. Возможно, ReSharper неточен или нацелен на гиперэффективность. –

+0

@CarlG: Не все источники данных LINQ ленивы, поэтому 'Any()' может быть дорогостоящим. (Например, по результату 'OrderBy' он не будет экономить время) –