繁体   English   中英

尽管 SingleOrDefault() 会返回 null,但 EF Core LINQ 查询何时导致 null 合并?

[英]When does EF Core LINQ query result in null coalescing despite SingleOrDefault() would return 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 异常,但 someProp 基本上只是简单地合并到null 这是预期的行为,仅仅是因为在这样的查询中引用.Code会以某种方式转换为 SQL 查询吗? 或者我在这里错过了什么?

  someProp = x.Valid ? ctx.Items.SingleOrDefault(i => i.Id == *someQueryThatReturns0*).Code : null;

如果项目 object 是 class,则此行肯定会在 SingleOrDefault 处返回 null,因此抛出 NullReferenceException。

如果它是一个结构类型,那么它将初始化结构,其所有值依次默认初始化(即零、null 等)。

假设它是 class,最终将someProp设置为null的唯一方法是,如果 Items 集合有一个 Id 等于 0 的项目,并且它的Code属性设置为null设置为false ,或者如果x.Valid

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM