У меня проблема с Skip-Take. Я работаю над приложением WPF и у меня есть таблица, которая в будущем будет содержать большое количество данных. По этой причине я решил разбить представление на индексы.
Я использую Entity Framework Core 2.2, и проблема возникает при запуске приложения и открытии представления, отображающего данные. Иногда для отображения данных требуется 25 секунд.
После многократной отладки была обнаружена строка, которая задержала выполнение, это строка, выполняющая запрос.
Код, приведенный ниже:
IQueryable<TResult> items = _context.Items
.AsNoTracking()
.Include(b => b.Category)
.Where(predicate ?? (p => true))
.OrderBy(i => i.Name)
.Select(target);
var total = await items.CountAsync();
var results = new Paginated<TResult>
(
data: items.Skip((model.PageSize - 1) * model.PageSize)
.Take(model.PageSize)
.ToList(),
total: total
);
return results;
Я надеюсь получить решение этой странной проблемы для повышения производительности.
Заранее спасибо.
Edite SQL-запрос, сгенерированный как:
exec sp_executesql N'SELECT [t].[Id], [t].[BoxesBalaita], [t].[Boxescontainer20], [t].[Boxescontainer40], [t].[CategoryId], [t].[Country], [t].[Imagepath], [t].[IsDeleted], [t].[ItemNumber], [t].[MinimumQuantity], [t].[Name], [t].[Sizelevel], [t].[Tariff], [t].[Weightbox], [i.Category].[Id], [i.Category].[Name], [i.Category].[ParentId]
FROM (
SELECT TOP(@__p_0) [i].[Id], [i].[BoxesBalaita], [i].[Boxescontainer20], [i].[Boxescontainer40], [i].[CategoryId], [i].[Country], [i].[Imagepath], [i].[IsDeleted], [i].[ItemNumber], [i].[MinimumQuantity], [i].[Name], [i].[Sizelevel], [i].[Tariff], [i].[Weightbox]
FROM [Items] AS [i]
) AS [t]
INNER JOIN [Categories] AS [i.Category] ON [t].[CategoryId] = [i.Category].[Id]
ORDER BY [t].[Id]
OFFSET @__p_1 ROWS',N'@__p_0 int,@__p_1 int',@__p_0=25,@__p_1=0
Выражение:
public static Expression<Func<Item, OutputModel>> Model => u => new OutputModel()
{
Id = u.Id,
Name = u.Name,
BoxesBalaita = u.BoxesBalaita,
Boxescontainer20 = u.Boxescontainer20,
Boxescontainer40 = u.Boxescontainer40,
Country = u.Country,
Imagepath = u.Imagepath,
MinimumQuantity = u.MinimumQuantity,
Sizelevel = u.Sizelevel,
Tariff = u.Tariff,
Weightbox = u.Weightbox,
ItemNumber = u.ItemNumber,
CategoryId = u.CategoryId,
CategoryName = u.Category.Name
};