Недостаточная эффективность 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, как показано ниже:

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

Мы получаем следующий сгенерированный SQL:

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

Это читает все записи и подсчитывает их в памяти ... Очень неэффективно, так как это должно выглядеть примерно так:

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

Есть ли вообще намек на сущность, что мы не хотим читать все записи в памяти и просто выполнять 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. Например:

var count = entities.Post.Where(p => 
       p.SiteID == 1 && p.CreatedDate != null).Query().Count();

Популярные ответы

Тестирование с помощью EF 6

db.Users.Count(u => u.LastName == "xyz")

а также

db.Users.Count(u => u.LastName == "xyz")

производят идентичные sql-запросы.

db.Users.Count(u => u.LastName == "xyz")



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