C # LINQ: запрос linq возвращает только отложенное перечисление? - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть метод

GetPostsByCategory

Я могу сделать это подобно подходу А, чтобы повторно использовать то, что у меня есть

A

public IEnumerable<Post> GetPostsByApartmentId(
    string apartmentId,
    int pageIndex,
    int pageSize,
    int max = 50)
{
    var itemsPerPage = Math.Max(pageSize, max);
    return _context.Post
        .Where(p => p.ApartmentId == apartmentId && !p.Disabled)
        .Skip((pageIndex - 1) * itemsPerPage)
        .Take(itemsPerPage);
}

public IEnumerable<Post> GetPostsByCategory(
    string categoryId,
    string apartmentId,
    int pageIndex,
    int pageSize,
    int max = 50)
{
    return GetPostsByApartmentId(apartmentId, pageIndex, pageSize, max)
        .Where(p => p.CategoryId == categoryId);
}

Но я обеспокоен производительностью для A, так что вот подход B

public IEnumerable<Post> GetPostsByCategory(
    string categoryId,
    string apartmentId,
    int pageIndex,
    int pageSize,
    int max)
{
    var itemsPerPage = Math.Max(pageSize, max);
    return _context.Post
        .Where(p => p.ApartmentId == apartmentId && !p.Disabled && p.CategoryId == categoryId)
        .Skip((pageIndex - 1) * itemsPerPage)
        .Take(itemsPerPage);
}

Однако я помнюЯ читал некоторые статьи, в которых говорилось: лямбда-выражение (или LINQ, не помню) на самом деле не выполняет запрос, оно просто создает запрос и выполняется только тогда, когда это необходимо или путем вызова чего-то вроде ToList ().Так что, если это так, то и A, и B должны быть одинаковыми.Кто-нибудь может подтвердить это?

1 Ответ

0 голосов
/ 22 апреля 2019

Вариант B будет быстрым, поскольку он получает отфильтрованные данные за один раз.

A извлечет все данные на основе условия, а затем отфильтрует на основе категории.Существует вероятность, что он может в конечном итоге получить непреднамеренные данные.

Редактировать:

Было бы интересно в случае хранимой процедуры, как она будет себя вести.

Если у вас есть доступ кЕсли бы после профилировщика было бы легко проверить, что является окончательным SQL-запросом к SQL-серверу для выполнения.

Я не очень уверен в этом, внутренний механизм структуры сущностей.

Но из вашего кодаЯ думаю, что для достижения одной и той же цели компилятор / EF должен сделать что-то за кулисами дважды.

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