2011-06-22 17 views
9

Aşağıdaki kod var: ancak kullanmak istediğim,Lambda LINQ- vs "İfade her zaman yanlış"

var thing = (from t in things 
      where t.Type == 1 && t.IsActive 
      select t).SingleOrDefault(); 

if (thing == null) 
{ 
    // throw exception 
} 

things Bu güzel çalışıyor

Varlık Framework Kendinden Takip varlıkları topluluğudur bir Lambda ifadesi yerine ve buna LINQ değiştirdi:

var thing = things.Select(t => t.Type == 1 && t.IsActive).SingleOrDefault(); 

Şimdi Resharper bana (thing == null) için Expression is always false anlatıyor.

Neleri özledim?

cevap

15

için istiyorum:

var thing = things.Where(t => t.Type == 1 && t.IsActive).SingleOrDefault(); 

Select (aksi halde, false değerleri truet.Type == 1 && t.IsActive == true halinde olan IEnumerable<bool> için IEnumerable<Thing> den IEnumerable dönüştürdükten) bir çıkıntı yapar, daha sonra SingleOrDefault döner ya bu sırayla tek bool veya dizinin boş olması durumunda false olan bool varsayılan değeri. bool bir referans türü olmadığından bu asla boş olamaz. IEnumerable<Thing> olarak IEnumerable türünü bırakarak -

Where

(bu durumda Type 1 ve IsActive true olduğu burada yalnızca seçerek belli bir kriteri yerine yalnızca nesneleri çekme) bir filtreleme işlemi gerçekleştirir. Thing bir sınıftır, SingleOrDefault dizideki tek öğeyi veya null'u döndürür.

Her iki durumda da, sıra birden fazla öğe içeriyorsa, SingleOrDefault bir istisna atar (bu, Select sürümünde çok daha olasıdır!).

+1

harika. çok teşekkürler! – Shevek