Недостаточная эффективность COUNT

c# entity-framework entity-framework-5 entity-framework-6

Вопрос

Мы испытываем очень низкую производительность, используя 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

И используя сущность framework с запросом 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?

Принятый ответ

Пытаться

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. Например:

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]



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему