我在C#中的实体框架中查询速度有问题。我创建了一个名为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<T> Page<T>(this IEnumerable<T> elements, int? page, int? pageSize)
{
if (page.HasValue && pageSize.HasValue)
return elements.Skip(page.Value * pageSize.Value).Take(pageSize.Value);
else
return elements;
}
答案 0 :(得分:10)
您的扩展方法应该超过IQueryable,以便EF可以处理表达式并使用分页生成SQL查询。
由于您使用的是IEnumerable,因此Page方法将调用Skip和Take of IEnumerable。这将导致枚举查询的结果(在调用Page之前)并在内存中对所有返回的项进行分页,而不是在数据库查询中包含分页。