LINQ to Entities - Skip & Take hang Иногда и отложенное выполнение - PullRequest
1 голос
/ 02 октября 2019

У меня проблема с 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

        };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...