2011-08-16 7 views
5

Parent_ObjectiveIDおよびidentityは、int?データ型です。私のプログラムでは、オブジェクトを返す必要がありますが、エラー:Sequence contains no elementsを返します。LINQ関数のnullable型に関する問題

私はidentity変数をnullに置き換えますが、それは動作しますが、私は理解しません。

currentObjective = (from p in cd.Objective 
        where p.Parent_ObjectiveID == null 
        select p).Single(); 

何が起こっているか

UPDATE 1:私はこれを行っている

if (identity == null) 
{ 
    currentObjective = (from p in cd.Objective 
         where p.Parent_ObjectiveID == null 
         select p).Single(); 
} 
else 
{ 
    currentObjective = (from p in cd.Objective 
         where p.Parent_ObjectiveID == identity 
         select p).Single(); 
} 

しかし、私は本当に好きではありません。

+0

Linq-To-SqlまたはLinq-To-Objectsについて話していますか?私はLinq-To-Objectsでこれをテストしましたが、それは私のために働きます。 (.NET 4.0) – magnattic

+0

@atticae Linq to SQL –

+0

なぜそれを 'linq-to-objects'でタグ付けしましたか? ;) – magnattic

答えて

1

LINQはwhere句でこのケースをサポートしていないようです。

This questionはほぼ同じ問題です。また、this threadを参照してください。

あなたは試みることができる:

Objective currentObjective = (from p in cd.Objective 
            where p.Parent_ObjectiveID == (identity ?? null) 
            select p).Single(); 

EDIT:これが機能しない場合、はObject.equalsと比較してみてください:

Objective currentObjective = (from p in cd.Objective 
            where object.Equals(p.Parent_ObjectiveID, identity) 
            select p).Single(); 
+0

私はまだそれを取得しません –

+0

私の編集を参照してください、これは動作するはずです – magnattic

+0

最初のコードは、(int?)nullを返しますが、それはちょうどnullになりますが動作するはずです。 たぶん私はどこのclaussuleとそのスーパーを排除する式で動作する必要があります –

0

を、私はこの問題を説明しLINQ to SQL Null check in Where Clauseの記事を見つけました。

from p in cd.Objective 
where object.Equals(p.Parent_ObjectiveID, identity) 
select p 
+0

それはヤコブを動作させませんでした –

0
from p in cd.Objective 
where p.Parent_ObjectiveID == identity 
select p 

は 'を選択*目的からどこParent_ObjectiveID == @identity' にコンパイルされます:あなたの代わりにobject.Equalsを使用することができますように見えます。 'Parent_ObjectiveID nullのどこ目的から選択*' と、

from p in cd.Objective 
where p.Parent_ObjectiveID == null 
select p 

はにコンパイルされます。

@identityがnullの場合、 'Parent_ObjectiveID == null'という句は常に 'false'を返します。