我们在使用 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/