使用扩展方法的实体框架分页很慢?

时间:2012-09-13 14:20:15

标签: c# linq entity-framework extension-methods

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

1 个答案:

答案 0 :(得分:10)

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

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