首页 > 解决方案 > 尽管 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 查询吗?或者我在这里错过了什么?

标签: c#linqentity-framework-core

解决方案


  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


推荐阅读