在 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 是如何定义的? Func predicate = f => f.ElementType == elementType 其中 elementType 是一个字符串参数 应该是Expression&lt;Func&lt;Element, bool&gt;&gt; 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,很抱歉造成混乱。实际上这是正确的。在将使用 Enumerable Where 的情况下,数据操作将发生在内存级别。但是,您提到了 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”类型的异常

如何在 Entity Framework Core 2 中播种?