加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 实体框架核心计数没有最佳性能

发布时间:2020-12-15 17:42:33 所属栏目:百科 来源:网络整理
导读:我需要获得一定的过滤器的记录数量. 理论上这个说明: _dbContext.People.Count (w = w.Type == 1); 它应该生成SQL,如: Select count (*)from PeopleWhere Type = 1 但是,生成的SQL是: Select Id,Name,Type,DateCreated,DateLastUpdate,Addressfrom People
我需要获得一定的过滤器的记录数量.

理论上这个说明:

_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 ();

实体框架生成以下查询:

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核心,直到它变得非常有用.回到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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读