Сбой LINQ в EF при поиске нулевых значений? - PullRequest
0 голосов
/ 19 марта 2012

У меня есть следующий код.

//I pick the first story where its StartSegment is not null.
var story = container.StorySet.FirstOrDefault(s => s.StartSegment != null);

if (story != null)
{

     //the following assert fails because story.StartSegment is null.
     Assert.IsNotNull(story.StartSegment,
                                         "The target story of this homework has no start segment.");

}

Этот модульный тест не пройден, потому что story.StartSegment фактически равен нулю, но с учетом лямбда-выражения FirstOrDefault, которое явно ищет истории, где начальный сегмент не равно нулю , я не думаю, что это имеет какой-то смысл.

Кто-нибудь может мне помочь?

Ответы [ 3 ]

3 голосов
/ 19 марта 2012

это проблема отложенной / активной загрузки.

на самом деле Story.StartSegment не равен нулю.

, но вы не включили его (из-за активной загрузки).попробуйте это ..

var story = container.StorySet
    .Include("StartSegment ")
    .FirstOrDefault(s => s.StartSegment != null);

предположите, что ваше отношение полномочий такое, как это ..

StorySet (много) ----- (0 или 1) StartSegment

StartSegment, определенный как "NavigationProperty" из StorySet.и ваш сгенерированный запрос выглядит как

SELECT * FROM StorySet WHERE StorySet.StartSegmentId is not null

, этот запрос возвращает некоторую существующую сущность., но по умолчанию EF не создаст мгновенное свойство навигации, пока вы явно не укажете его .Include ("StartSegment")

1 голос
/ 13 июля 2012

Попробуйте следующий код:

var story = container.StorySet.Where(s => s.StartSegment != null).FirstOrDefault(); 
0 голосов
/ 19 марта 2012

Я думаю, что это проблема логики DB bool.В SQL это не так: someNullValue = NULL.Вместо этого вы должны использовать someNullValue IS NULL.Возможно, EF не заботится о правильном сравнении нуля в этом случае, поэтому он просто возвращает первый элемент, который может иметь значение null StartSegment.Проверьте запрос, который выдается к базе данных.Он должен иметь предикат IS NULL, а не что-то вроде = NULL

...