搜索空值时,EF中的LINQ失败了吗?

时间:2012-03-19 11:28:06

标签: c# entity-framework entity-framework-5

我有以下代码。

//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实际上是null,但是给定FirstOrDefault lambda表达式明确搜索起始段不为空的故事,我不认为这是有道理的。

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:3)

这是懒惰/急切的负担问题。

实际上Story.StartSegment不为空。

但你没有包含它(通过急切加载)。试试这个..

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

假设您的权利关系是这样的..

StorySet (很多)-----(0或1) StartSegment

StartSegment定义为StorySet的“NavigationProperty”。并且您生成的查询看起来像

SELECT * FROM StorySet WHERE StorySet.StartSegmentId is not null

此查询返回一些现有实体。 但默认情况下,在您明确告知之前,EF不会创建导航属性的瞬间.Include(“StartSegment”)

答案 1 :(得分:1)

请尝试以下代码:

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

答案 2 :(得分:0)

我认为这是DB bool逻辑相关的问题。在SQL中,这不是真的:someNullValue = NULL。相反,您应该使用someNullValue IS NULL。在这种情况下,EF可能并不关心正确的空值比较,因此它只返回第一个元素,该元素可能为null StartSegment。检查它是否已发布到数据库的查询。它应该有IS NULL谓词,而不是= NULL