对内部集合的DbSet LINQ查询未引发Argumentexception



我遇到了这种奇怪的行为,并想知道它是如何工作的。

_dbContext.MyDbSet.Where(setItem =>
setItem.InnerCollection.All(...)
).ToList()

即使InnerCollection为null,这段代码也能正常工作。令我惊讶的是,这两个部分都在内部集合上抛出了ArgumentNullException。

_dbContext.MyDbSet.Local.Where(setItem =>
setItem.InnerCollection.All(...)
).ToList()

_dbContext.MyDbSet.ToList().Where(setItem =>
setItem.InnerCollection.All(...)
).ToList()

有人能解释一下这怎么可能吗?DbSet后面有null约束吗?提前谢谢。

第一个问题的答案很简单:

使用时

_dbContext.MyDbSet.Where(setItem =>
setItem.InnerCollection.All(...)
).ToList()

EF生成一个JOIN语句,并对数据库执行筛选,因此不会引发ArgumentNullException

而在筛选之前调用LocalToList()时,所有实体都会从数据库中加载并在内存中进行筛选。因此,在这个版本中,如果不包括相应的导航属性并且出现ArgumentNullException,则列表为空。

相关内容

  • 没有找到相关文章

最新更新