使用扩展方法的entity framework分页很慢?

我在C#中的entity framework中查询速度有问题。 我创建了一个名为Page的扩展方法来处理分页,但是当我使用它时,查询变得非常慢。 如果我只是做.Skip(page.Value * pageSize.Value).Take(pageSize.Value)而不是使用Page,查询得到的速度要快得多。 我想在使用Page时,在分页之前获取所有联系人。 有没有办法防止这种情况或我做错了什么?

查询:

var contacts = db.Contacts .Where(x => x.AccountID == accountID && x.Deleted == false) .OrderByDescending(x => x.FirstName) .ThenBy(x => x.LastName) .ThenBy(x => x.CreatedDate) .Page(page, pageSize); return contacts.ToList(); 

扩展方法:

  public static IEnumerable Page(this IEnumerable elements, int? page, int? pageSize) { if (page.HasValue && pageSize.HasValue) return elements.Skip(page.Value * pageSize.Value).Take(pageSize.Value); else return elements; } 

您的扩展方法应该超过IQueryable,以便EF可以处理表达式并使用分页生成SQL查询。

由于您使用的是IEnumerable,因此Page方法将调用Skip和Take of IEnumerable。 这将导致枚举构建到该点的查询结果(在调用Page之前)并在内存中对所有返回的项进行分页,而不是在数据库查询中包括分页。