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

Noc*_*las 5 c# linq extension-methods entity-framework

我在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();
Run Code Online (Sandbox Code Playgroud)

扩展方法:

    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;
    }
Run Code Online (Sandbox Code Playgroud)

小智 10

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

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