c# – 具有可空的Linq表达式

看起来像愚蠢的问题,但我只是不明白.
我的实体:
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);

引发序列不包含任何元素

我错过了什么?

解决方法

我相信有些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部分(带有文字null)强制转换为ISNULL或sql等价物.

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

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...