为什么LINQ-to-SQL分页在函数内失败?

时间:2010-03-15 19:50:58

标签: c# linq linq-to-sql

这里我有一个任意的IEnumerable<T>。我想使用通用辅助函数对其进行分页,而不是每次都编写Skip / Take对。这是我的功能:

IEnumerable<T> GetPagedResults<T>(IEnumerable<T> query, int pageIndex, int pageSize)
{
   return query.Skip((pageIndex - 1) * pageSize).Take(pageSize);
}

我的代码是:

result = GetPagedResults(query, 1, 10).ToList();

这会产生一个没有TOP 10关键字的SELECT语句。但是下面的代码用它生成了SELECT:

result = query.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();

我在功能上做错了什么?

2 个答案:

答案 0 :(得分:3)

我认为您需要将其更改为使用IQueryable,以便维持延迟执行。当您使用IEnumerable时,它将在执行基本查询后在内存中应用额外的函数(Skip,Take等)。但是,使用IQueryable将导致其他方法包含在发送到数据库的查询中。

答案 1 :(得分:2)

尝试使用IQueryable ......

IQueryable<T> GetPagedResults<T>(IQueryable<T> query, 
                                 int pageIndex, 
                                 int pageSize)
{
    return query.Skip((pageIndex - 1) * pageSize).Take(pageSize);
}