【发布时间】:2016-11-11 22:08:46
【问题描述】:
我需要通过某个过滤器获取记录的数量。
理论上这条指令:
_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
.. 运行速度非常快。
如何生成第二个查询,将搜索条件传递给计数?
【问题讨论】:
-
你的第一次尝试“应该”得到你想要的。它似乎正在执行
.Count([predicate])的 IEnumerable 版本,而不是会生成预期 SQL 的 IQueriable 版本……某些原因导致您的代码选择了不正确的扩展名。 -
_dbContext.People声明为什么类型? -
@Theo 我不使用 IEnumerable 版本。我已经验证过了!
-
尝试升级到 EF Core 1.1.0。 EF 团队对查询生成进行了一些改进——我在我的项目中发现了更优化的 JOIN 查询,我的麻烦也将解决。 EF Core 很年轻。
-
@Renatto Machado 我刚刚创建了一个空项目和一个示例数据库,其中包含一个像您这样的表,安装了 EF Core 1.1,返回的查询是正确的。也许你真的应该更新库。
标签: c# sql-server linq entity-framework-core