Что вызовет запрос Entity Framework IQueryable в вспомогательном классе, который наследует List <T>? - PullRequest
0 голосов
/ 14 ноября 2018

Я взял это из Nerd Dinner и из других мест,

public class PaginatedList<T> : List<T> {

    public int PageIndex  { get; private set; }
    public int PageSize   { get; private set; }
    public int TotalCount { get; private set; }
    public int TotalPages { get; private set; }

    public PaginatedList(IQueryable<T> source, int pageIndex, int pageSize) {
        PageIndex = pageIndex;
        PageSize = pageSize;
        TotalCount = source.Count();
        TotalPages = (int) Math.Ceiling(TotalCount / (double)PageSize);

        this.AddRange(source.Skip(PageIndex * PageSize).Take(PageSize));
    }

    public bool HasPreviousPage {
        get {
            return (PageIndex > 0);
        }
    }

    public bool HasNextPage {
        get {
            return (PageIndex+1 < TotalPages);
        }
    }
}

Что вызывает выполнение отложенного запроса IQueryable? Это потому, что AddRange принимает IEnumerable? Сам AddRange возвращает void.

1 Ответ

0 голосов
/ 14 ноября 2018

Что вызывает выполнение отложенного запроса IQueryable?

Внутренне List<T>.AddRange перечисляет IEnumerable, что приводит к выполнению запроса.

Если вы хотите отложить это, вам придется переопределить AddRange и большинство других List<T> членов , чтобы выполнить запрос, , а затем пройти к базе осуществление.

Я не вижу выгоды от отсрочки запроса.

EDIT

Я полностью пропустил Count звонок. Это выполнит подобный запрос (в основном необработанный запрос, заключенный во внешний запрос COUNT(*)), что также может быть проблемой. Если запрос очень сложный и выполнение подсчета занимает много времени, это также может быть источником проблем с производительностью.

...