在 Entity Framework Core 中,如何使用数据库级别的条件(不是本地 LINQ)查询连接表上的数据?
Posted
技术标签:
【中文标题】在 Entity Framework Core 中,如何使用数据库级别的条件(不是本地 LINQ)查询连接表上的数据?【英文标题】:In Entity Framework Core, how can I query data on joined tables with a condition at DB level (not local LINQ)? 【发布时间】:2020-08-18 14:03:25 【问题描述】:作为一个小型 .NET Core 3 项目的一部分,我正在尝试使用基于 Entity Framework 的数据模型,但在查询连接表时遇到了一些问题。
在单个表中查找匹配某个条件的数据时,模型很容易理解
List<Element> listOfElements = context.Elements.Where(predicate).ToList();
但是,当此查询需要连接表时,我不确定如何有效地执行此操作。经过一番调查,似乎包含(然后包含)方法是要走的路,但我的印象是包含后的 Where 子句不是在数据库级别执行,而是在检索到所有数据之后。这可能适用于小型数据集,但我认为对于具有数百万行的生产系统来说这不是一个好主意。
List<Element> listOfElements = context.Elements.Include(x => x.SubElement).
Where(predicate).ToList();
我看到了一些使用 EF+ 库的示例,但我正在寻找使用名义上的 EF Core 的解决方案。有什么干净/优雅的方法吗?
谢谢。
【问题讨论】:
您的predicate
是如何定义的?
FuncExpression<Func<Element, bool>> predicate
。否则,它只会匹配 Enumerable.Where()
(即 Linq-to-Objects - In memory)而不是您想要的 Queryable.Where()
。见***.com/questions/793571/…
@haim770 我相信你是对的,如果你不使用 Queryable.Where() 过滤器将在内存中执行而不是在数据库中执行。
正如@haim770 评论的那样,解决方案是在访问 Queryable.Where 而不是 Enumerable.Where 之前添加“表达式”。谢谢!如果需要,请将其添加为答案,因为它是我的问题的实际解决方案。
【参考方案1】:
在填充来自 DB 的数据时有几种情况:
延迟查询执行:这是当您尝试访问查询结果时,例如,在foreach
语句中。
立即执行查询:当您调用ToList()
(或转换为其他集合,如ToArray()
)时。
我认为你的问题的答案是:
...但我的印象是包含后的 Where 子句不是在数据库级别执行,而是在检索到所有数据之后。
你的假设是错误的,因为你最后调用了ToList()
,而不是在Where
方法之前。
更多信息请查看here。
我还有另一个建议:在执行您的查询时,要确定在 DB 级别运行 SQL Server Profiler 究竟执行了什么。
希望这会有所帮助))
【讨论】:
正如@haim770 在原始帖子的 cmets 中提到的那样,假设没有错,因为使用的谓词 Where() 使用的方法不是 Queryable.Where() 方法,这将使查询在本地执行,所有内容都在内存中,而不是在数据库本身中 正如@haim770 提到的,问题在于使用了哪个 Where 方法,Enumerable 而不是 Queryable。 @Rhadamon,很抱歉造成混乱。实际上这是正确的。在将使用 EnumerableWhere
的情况下,数据操作将发生在内存级别。但是,您提到了 Include 这样的方法,如果将其应用于 DB 上下文,它将适用于数据库查询 (IQuerable
) 级别。请把我的回答与具体情况联系起来,因为对于普通内存收集的情况,您不必担心Where
子句的执行顺序。以上是关于在 Entity Framework Core 中,如何使用数据库级别的条件(不是本地 LINQ)查询连接表上的数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Entity Framework Core 中运行存储过程?
如何在 Entity Framework Core 中运行存储过程?
什么是自有实体?何时以及为什么在 Entity Framework Core 中使用 Owned Entity?
Entity Framework Core 中 TimeSpan 的总和
Entity Framework优化一:引发了“System.Data.Entity.Core.EntityCommandExecutionException”类型的异常