在继承 List<T> 的助手 class 中,什么会触发 Entity Framework IQueryable 查询?

What will trigger an Entity Framework IQueryable query, in a helper class that inherits List<T>?

这是我从 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 本身 returns void.

What is causing the IQueryable deferred query to run?

在内部,List<T>.AddRange 枚举 IEnumerable,这会导致查询执行。

如果你想推迟它,你必须覆盖 AddRange 和大多数其他 List<T> 成员 来执行查询,然后 传递到基础实现。

我看不到延迟查询的好处。

编辑

我完全错过了 Count 电话。这将执行一个 similar 查询(基本上是包装在 COUNT(*) 外部查询中的原始查询),这也可能是一个问题。如果查询非常复杂并且执行计数需要很长时间,这也可能是性能问题的根源。