2011-06-22 4 views
9

私は次のコードを持っている:ラムダLINQ-対「式が常に偽である」

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

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

thingsは、しかし、私が使用したい、これはうまく動作Entity Frameworkの自己追跡エンティティ

のコレクションですラムダ式ではなく、これにLINQを変更:

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

今ReSharperのは(thing == null)を掲載しExpression is always false語っています。

私は何が欠けていますか?

答えて

15

したい:

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

Selectは次にSingleOrDefault戻り、このシーケンスでのみboolいずれかで、投影(t.Type == 1 && t.IsActive == true場合の値trueIEnumerable<bool>IEnumerable<Thing>からのIEnumerableの種類を変換する、そうでなければfalse)を行いますシーケンスが空の場合はboolのデフォルト値はfalseです。 boolは参照型ではないため、これはnullにはなりません。 IEnumerable<Thing>としてのIEnumerableの種類を残し、 -

Where(この場合にのみType1でありIsActivetrueであるものを選択し、所与の基準を満たすオブジェクトのみを引き抜く)フィルタリング動作を行います。 Thingがクラスであると仮定すると、SingleOrDefaultはシーケンス内の唯一の項目、またはnullを返します。

どちらの場合でも、SingleOrDefaultは、シーケンスに複数のアイテムが含まれていると例外がスローされます(これはSelectバージョンのほうがはるかに可能です)。

+1

素晴らしい。どうもありがとう! – Shevek