Linq表达式可以为空

Won*_*der 6 c# linq linq-to-entities

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

public class Page
{
    public int Id { get; set; }
    //...
    public int? ParentId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在控制器中:

db.Pages.First(x => x.ParentId == null);
Run Code Online (Sandbox Code Playgroud)

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

int? test = null;
db.Pages.First(x => x.ParentId == test);
Run Code Online (Sandbox Code Playgroud)

抛出 Sequence contains no elements

我错过了什么?

Jon*_*eet 10

我相信有些LINQ提供程序在null之间存在一种奇怪的现象.尝试:

var query = db.Pages.First(x => (test != null && x.ParentId == test) ||
                                (test == null && x.ParentId == null));
Run Code Online (Sandbox Code Playgroud)

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

var query = test == null ? db.Pages.First(x => x.ParentId == null)
                         : db.Pages.First(x => x.ParentId == test);
Run Code Online (Sandbox Code Playgroud)

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

WHERE X = Y
Run Code Online (Sandbox Code Playgroud)

如果X和Y都是空值,则仍然会失败.使用该== null部分(使用文字 null)强制转换为ISNULLSQL等效项或其他任何内容.

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