我在 C# 的实体框架中遇到查询缓慢的问题。我创建了一个名为 Page 的扩展方法来处理分页,但是当我使用它时,查询变得非常慢。如果我只是执行 .Skip(page.Value * pageSize.Value).Take(pageSize.Value) 而不是使用 Page,查询会变得更快。我想用 Page 执行此操作会在分页之前获取所有联系人。有没有办法防止这种情况,或者我做错了什么?
Query:
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;
}
您的扩展方法应该基于 IQueryable,以便 EF 可以处理表达式并生成带分页的 SQL 查询。
由于您使用 IEnumerable,Page 方法将调用 IEnumerable 的 Skip 和 Take。这将导致枚举到该点(在调用 Page 之前)构建的查询结果,并在内存中对所有返回的项目进行分页,而不是在数据库查询上包括分页。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)