使用带有MySql Connector 6.6.6.0的Entity Framework 5.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查询的实体框架,如下所示:
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?
2 回答
尝试
http://msdn.microsoft.com/en-us/data/jj574232.aspx
在页面底部有这个:
使用Query来计算相关实体而不加载它们
有时,知道有多少实体与数据库中的另一个实体相关而实际上不会产生加载所有这些实体的成本是有用的 . 使用LINQ Count方法的Query方法可用于执行此操作 . 例如:
使用EF 6进行测试
和
生成相同的SQL查询 .