首页 > 解决方案 > 对内部集合的 DbSet LINQ 查询不会引发 Argumentexception

问题描述

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

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

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

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

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

谁能解释一下这怎么可能?nullDbSet 背后是否有任何控制?提前致谢。

标签: entity-frameworklinqdbcontextdbset

解决方案


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

使用时

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

EF 生成一个 JOIN 语句并在数据库上执行过滤,因此没有ArgumentNullException引发。

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


推荐阅读