c# - 尽管 SingleOrDefault() 将返回 null,但 EF Core LINQ 查询何时导致 null 合并?
问题描述
我有一个针对 DbContext 的查询,例如:
ctx.Items.SingleOrDefault(i => i.Id == *someQueryThatReturns0*).Code
这someQueryThatReturns0
是一个查找 Id 的查询,类似于以下内容:
otherItems.Where(h => h.Id == xyz).Select(s => s.OtherId).SingleOrDefault()
当这个内部查询没有结果时,内部SingleOrDefault
将返回 0,因为 Id 是 int,这意味着外部Items.SingleOrDefault(..)
应该返回 null。
但是当引用Items.SingleOrDefault(..).Code
而不是获取 NullRef 异常时,它将只是 null。
这整个事情是一个更大的查询的一部分,它用于在 Select() 中设置值,例如:
someComplexQuery.Select(x => new someDto(){
...
someProp = x.Valid ? ctx.Items.SingleOrDefault(i => i.Id == *someQueryThatReturns0*).Code : null;
...
})
在执行查询时,我会期待一个 NullRef 异常,但 somePropnull
基本上只是简单地合并到。这是预期的行为,仅仅是因为.Code
这样的查询中的引用会以某种方式转换为 SQL 查询吗?或者我在这里错过了什么?
解决方案
someProp = x.Valid ? ctx.Items.SingleOrDefault(i => i.Id == *someQueryThatReturns0*).Code : null;
如果 Item 对象是一个类,那么这一行肯定会在 SingleOrDefault 处返回 null,因此会抛出 NullReferenceException。
如果它是一个结构类型,那么它将用它的所有值来初始化结构,然后默认初始化(即零、空等)。
someProp
假设它是一个类,最终设置为的唯一方法null
是,如果 Items 集合有一个 Id 等于 0 的项目,并且它的Code
属性设置为null
,或者如果x.Valid
设置为false
。
推荐阅读
- javascript - 正则表达式搜索 href="something" 模式
- django - Django Rest Framework urls.py 搞砸了
- c++ - 二维数组无法正确打印
- angular - 通过在元素查询中包装的文本匹配跨度的正确方法是什么?
- linux - 在精灵二进制中,有没有简单的方法从偏移量获取内存地址?
- firebase - 如何在 React Native Firebase 中发送 ecommerceBundle?
- excel - 在工作表中定位图片
- powerbi - 如何在dax公式中找到计算的人口
- r - fread() 用方括号外的逗号作为分隔符
- android - 延迟 15 秒的 Handler 仅在设备充电时才能正常工作