5

我在 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;
    }
4

1 回答 1

10

您的扩展方法应该在 IQueryable 之上,以便 EF 可以处理表达式并生成带有分页的 SQL 查询。

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

于 2012-09-13T14:30:51.110 回答