我需要获得一定的过滤器的记录数量.
理论上这个说明:
_dbContext.People.Count (w => w.Type == 1);
Select count (*) from People Where Type = 1
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