2010-07-15 22 views
31

Böyle görünen bir linq sorgum varsa, sorgu tarafından herhangi bir sonuç bulunup bulunmadığını görmek için nasıl denetleyebilirim?Linq Sonucu Boşsa

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

Ninjaları aramak için neden sıkıldınız? Sadece bulamadığınızı varsayalım. Hiç. – dlras2

cevap

82

Bir dizi boş olup olmadığını kontrol etmek için bir yol olarak Count() yöntemi kullanarak önlemek için çalışmalısınız. Phil Haack'in bu antipattern'i tartıştığı an excellent article on his blog vardır. Dizi, dizinin tüm öğelerini gerçekten numaralandırmalıdır. Bu, dizinin birden çok LINQ işlemine (veya bir veri tabanından gelir) dayalı olması durumunda pahalı olabilir.

Bunun yerine, Any() uzantı yöntemini kullanmalısınız; bu, yalnızca listede en az bir öğe olup olmadığını görmeye çalışır, ancak tüm diziyi numaralandırmayacaktır.

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

Şahsen ben de Any() yerine Count() daha iyi kullanılması, amacınızı ifade ve planı ayrı ya da gelecekte güvenilir değiştirmek daha kolay olduğunu düşünüyorum.

Bu arada, gerçekten istediğiniz şey dizinin ilk (veya tek) üyesiyse, bunun yerine First() veya Single() işleçlerini kullanmanız gerekir.

+1

Makalenin '.Any()' yalnızca bir kez '.MoveNext()' işlevini çağırmasına rağmen, ReSharper (7), '.Any()' kullanırken diğer numaralandırma yöntemlerini kullanırken olası çoklu numaralandırmalardan şikayet edecektir. Belki ReSharper yanlıştır ya da hiper verimliliği hedefler. –

+0

@CarlG: LINQ verilerinin tüm kaynakları tembel değildir, bu yüzden 'Any()' pahalı olabilir. (Örneğin, bir "OrderBy" sonucunda, herhangi bir zaman kaydetmez) –

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

}