У меня проблема с производительностью Entity Framework и Linq при просмотре списка объектов Product:
var data =_service.GetAll();
var page = data.Skip((index) * pageSize).Take(pageSize);
list.Add(page.AsEnumerable); // ** its slow right here
В моей тестовой базе данных содержится 1958 продуктов, но при выполнении приведенного выше кода я вижу 3916 (то есть 1958 * 2) отдельных выполненных запросов (глядя на профилировщик SQL).
Класс Product выглядит примерно так:
public class Product
{
public virtual int Id {get;set;}
public virtual string ProductCode {get;set;}
//..etc other properties
public virtual ICollection<WarehouseProduct> WarehouseProducts { // etc }
public virtual ICollection<InvoiceLine> InvoiceLines { // etc }
// etc other navigation properties
}
В профиле SQL Server я вижу этот запрос, выполненный 3916 раз:
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[ProductId] AS [ProductId],
// etc
FROM [dbo].[WarehouseProducts] AS [Extent1]
Что я сделал не так? Объект Product имеет 12 различных свойств навигации, но только WarehouseProduct был запрошен 3916 раз. Обратите внимание, что в этом запросе нет предложения WHERE, но между двумя таблицами существует отношение внешнего ключа (поэтому это свойство навигации)