c# - Entity Framework COUNT 性能不佳

标签 c# entity-framework entity-framework-6 entity-framework-5

我们在使用 Entity Framework 5.0 和 MySql Connector 6.6.6.0 进行基于计数的查询时遇到了非常糟糕的性能。我们的数据结构如下:

Table: Post
===========
ID           INT PRIMARY KEY
MemberID     INT NOT NULL
SiteID       INT NOT NULL
Description  VARCHAR(255) NOT NULL
Image        VARCHAR(255) NOT NULL
CreatedDate  DATETIME NULL

并使用带有 linq 查询的 Entity Framework ,如下所示:

var count = entities.Post.Where(p => 
    p.SiteID == 1 && p.CreatedDate != null).Count();

我们得到以下生成的 SQL:

SELECT
`Extent1`.`ID`, 
`Extent1`.`MemberID`, 
`Extent1`.`SiteID`, 
`Extent1`.`Description`, 
`Extent1`.`Image`, 
`Extent1`.`CreatedDate`
FROM `Post` AS `Extent1`
 WHERE (`Extent1`.`SiteID` = 1) AND (`Extent1`.`CreatedDate` IS NOT NULL)

这会读取所有记录并在内存中对它们进行计数...非常低效,因为它应该看起来像这样:

SELECT COUNT(ID) FROM `Post` WHERE `SiteID` = 1 AND `CreatedDate` IS NOT NULL;

有没有办法向实体暗示我们不想将所有记录读入内存而只是执行 SQL COUNT?

最佳答案

尝试

var count = entities.Post.Where(p => 
       p.SiteID == 1 && p.CreatedDate != null).Query().Count();

http://msdn.microsoft.com/en-us/data/jj574232.aspx

在页面底部有这个:

使用 Query 计算相关实体而不加载它们

有时,了解有多少实体与数据库中的另一个实体相关是很有用的,而不会实际产生加载所有这些实体的成本。带有 LINQ Count 方法的 Query 方法可用于执行此操作。例如:

using (var context = new BloggingContext()) 
{ 
    var blog = context.Blogs.Find(1); 

    // Count how many posts the blog has  
    var postCount = context.Entry(blog) 
                          .Collection(b => b.Posts) 
                          .Query() 
                          .Count(); 
}

关于c# - Entity Framework COUNT 性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22186674/

相关文章:

c# - ASP.Net Core JWT 登录未设置 HttpContext.User.Claims

c# - 如何解析类型为 'IdentityServer4.EntityFramework.Options.OperationalStoreOptions' 的服务

c# - Entity Framework 获取缓慢

c# - Identity Owin 是否需要延迟加载?

c# - 在 C# 中对对象列表进行排序

C# 在 lambda 表达式中切换

c# - 在 C# 中比较 2 个价格作为数据类型字符串

c# - 我的 ViewModel 导致了多个错误

c# - 如何解决 "The method ' Skip' 仅支持 LINQ to Entities 中的排序输入。”

c# - IdentityServer4 与 EF6