首页 文章

实体框架COUNT性能差

提问于
浏览
4

使用带有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 回答

  • 1

    尝试

    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(); 
    }
    
  • 4

    使用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]
    

相关问题