entity frameworkCOUNT性能差
使用带有MySql Connector 6.6.6.0的Entity Framework 5.0进行基于计数的查询时,我们遇到的性能非常差。 我们的数据结构如下:
表:邮政 =========== ID INT PRIMARY KEY MemberID INT NOT NULL SiteID INT NOT NULL 说明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:
选择 `Extent1`.`ID`, `Extent1`.`MemberID`, `Extent1`.`SiteID`, `Extent1`.`Description`, `Extent1`.`Image`, `Extent1`.`CreatedDate` 从`Post` AS`Extent1` WHERE(`Extent1` .SiteID` = 1)AND(`Extent1` .CreatedDate` IS NOT NULL)
这会读取所有记录并将它们计入内存中……效率非常低,因为它应该类似于:
SELECT COUNT(ID)FROM`Post` WHERE`SiteID` = 1 AND`CredatedDate` 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(); }
使用EF 6进行测试
db.Users.Count(u => u.LastName == "xyz")
和
db.Users.Where(u=>u.LastName=="xyz").Count()
产生相同的SQL查询。
SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[Users] AS [Extent1] WHERE N'xyz' = [Extent1].[LastName] ) AS [GroupBy1]