Проблемы с обнуляемыми типами в функции LINQ - PullRequest
5 голосов
/ 17 августа 2011

Parent_ObjectiveID и identity имеют тип данных int?.В моей программе должен возвращаться объект, но он выдает ошибку: Sequence contains no elements.

int? identity = null;

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

Хотя, если я заменил переменную тождества на ноль.Это работает, но я не понимаю.

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

Что происходит?

ОБНОВЛЕНИЕ 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();
}

Но мне это не очень нравится.

Ответы [ 3 ]

1 голос
/ 17 августа 2011

LINQ, похоже, не поддерживает этот случай в предложении where.

Этот вопрос касается той же проблемы.Также см. этот поток .

. Вы можете попробовать:

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

РЕДАКТИРОВАТЬ: Если это не работает, попробуйте сравнить с object.Equals:

Objective currentObjective = (from p in cd.Objective
                                  where object.Equals(p.Parent_ObjectiveID, identity)
                                  select p).Single();
0 голосов
/ 18 августа 2011
from p in cd.Objective
where p.Parent_ObjectiveID == identity
select p

будет скомпилировано, чтобы 'выбрать * из цели, где Parent_ObjectiveID == @ identity '. И,

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

будет скомпилировано для 'select * from target, где Parent_ObjectiveID равно нулю '.

Предложение 'where Parent_ObjectiveID == null' всегда будет возвращать 'false', когда ваша @identity равна нулю.

0 голосов
/ 17 августа 2011

Я нашел статью на Проверка LINQ to SQL Null в разделе Где , которая объясняет эту проблему. Похоже, вы можете использовать object.Equals вместо:

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