gpt4 book ai didi

c# - Entity Framework Core 计数没有最佳性能

转载 作者:可可西里 更新时间:2023-11-01 02:58:41 25 4
gpt4 key购买 nike

我需要使用特定过滤器获取记录的数量。

理论上这条指令:

_dbContext.People.Count (w => w.Type == 1);

它应该生成如下 SQL:

Select count (*)
from People
Where Type = 1

然而,生成的SQL是:

Select Id, Name, Type, DateCreated, DateLastUpdate, Address
from People
Where Type = 1

正在生成的查询需要更长的时间才能在包含许多记录的数据库中运行。

我需要生成第一个查询。

如果我这样做:

_dbContext.People.Count ();

Entity Framework 生成以下查询:

Select count (*)
from People

.. 运行速度非常快。

如何生成将搜索条件传递给计数的第二个查询?

最佳答案

这里没有太多要回答的。如果您的 ORM 工具没有从简单的 LINQ 查询中生成预期的 SQL 查询,您就无法通过重写查询让它做到这一点(您一开始就不应该这样做)。

EF Core 有一个概念,即在 LINQ 查询中混合客户端/数据库评估,这允许他们发布 EF Core 版本,查询处理不完整/非常低效,就像您的情况一样。

摘自 Features not in EF Core (注意这个词)和Roadmap :

Improved translation to enable more queries to successfully execute, with more logic being evaluated in the database (rather than in-memory).

不久,他们计划改进查询处理,但我们不知道何时会发生以及程度如何(记住混合模式允许他们考虑查询“工作”)。

那么有哪些选择呢?

  • 首先,在 EF Core 变得真正有用​​之前,请远离它。返回到 EF6,它没有此类问题。
  • 如果您不能使用 EF6,请随时更新最新的 EF Core 版本。

例如,在 v1.0.1 和 v1.1.0 中,您查询都会生成预期的 SQL(已测试),因此您只需升级即可解决具体问题。

但请注意,除了改进之外,新版本还引入了错误/回归(例如,您可以在此处看到 EFCore returning too many columns for a simple LEFT OUTER join),因此请自行承担风险(并再次考虑第一个选项,即 Which One Is Right for You :)

关于c# - Entity Framework Core 计数没有最佳性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40557003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com