Linq表达式可以为空

时间:2012-02-14 09:54:46

标签: c# linq linq-to-entities

看起来像愚蠢的问题,但我只是不明白。 我的实体:

public class Page
{
    public int Id { get; set; }
    //...
    public int? ParentId { get; set; }
}

在控制器中:

db.Pages.First(x => x.ParentId == null);

按预期工作(返回一些元素)。 但是:

int? test = null;
db.Pages.First(x => x.ParentId == test);

引发Sequence contains no elements

我想念什么?

3 个答案:

答案 0 :(得分:10)

我相信一些LINQ提供商在null之间存在一种奇怪的现象。尝试:

var query = db.Pages.First(x => (test != null && x.ParentId == test) ||
                                (test == null && x.ParentId == null));

或者,针对不同情况使用不同的查询:

var query = test == null ? db.Pages.First(x => x.ParentId == null)
                         : db.Pages.First(x => x.ParentId == test);

基本上这是因为SQL将NULL视为不等于自身,所以:

WHERE X = Y
如果X和Y都是空值,

仍然会失败。使用== null部分( literal null)强制转换为ISNULL或SQL等价物。

我同意这是一种痛苦,而其他人可能会有更好的解决方法,但这可能有助于你开始。

答案 1 :(得分:2)

你可以做一些像这样的解决方法:

int? test = null;
if(test.HasValue) {
 db.Pages.First(x => x.ParentId == test.Value);
} else {
 db.Pages.First(x => x.ParentId == null);
}

我假设int?实际上是Nullable<int>我们的linq-to-entities提供商没有比较正确的事情。

答案 2 :(得分:1)

试试这个(根据gdoron的评论修改。现在正是gideon发布的,所以请接受他而不是我的):

int? test = null;
if(test.HasValue) {
    db.Pages.First(x => x.ParentId == test.Value);
} else {
    db.Pages.First(x => x.ParentId == null);
}