2011-08-16 14 views
5

Parent_ObjectiveID i identity to int? typ danych. W moim programie powinien zwrócić obiekt, ale daje błąd: Sequence contains no elements.Problemy z typami zerowymi w funkcji LINQ

int? identity = null; 

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

Chociaż, jeśli zmienię zmienną tożsamości na null. Działa, ale nie rozumiem.

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

Co się dzieje?

UPDATE 1:

Zrobiłem to:

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(); 
} 

Ale ja naprawdę nie podoba.

+0

Mówisz o Linq-To-Sql lub Linq-To-Objects? Właśnie testowałem to z Linq-To-Objects i działa to dla mnie. (.NET 4.0) – magnattic

+0

@atticae Linq do SQL –

+0

Dlaczego oznaczono go tagiem 'linq-to-objects'? ;) – magnattic

Odpowiedz

1

LINQ nie wydaje się wspierać tego przypadku w klauzuli where.

This question dotyczy tego samego problemu. Zobacz także this thread.

można spróbować:

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

EDIT: Jeśli to nie zadziała, spróbuj porównać object.Equals:

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

Jeszcze go nie dostaję –

+0

zobacz moją edycję, to powinno zadziałać – magnattic

+0

Pierwszy kod powinien zadziałać, chociaż zwraca wartość (int?) null, a do pracy będzie miała wartość zerową. Może powinienem pracować z Where claussule i wyrażeniami, aby wyeliminować to super, jeśli –

0

znalazłem artykuł na LINQ to SQL Null check in Where Clause który wyjaśnia ten problem. Wygląda na to, można użyć object.Equals zamiast:

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

To nie wyszło jak Jacob –

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

zostaną skompilowane do 'select * from cel gdzie Parent_ObjectiveID == @identity'. I

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

zostaną skompilowane do 'select * from cel gdzie Parent_ObjectiveID jest null'.

Klauzula "gdzie Parent_ObjectiveID == null" zawsze zwróci "false", gdy twoja @identity ma wartość null.