LINQ:分页技术,使用take和skip但是也需要总记录 - 如何实现这个?

Mar*_*tin 4 c# linq count subquery linq-to-sql

我已经使用skip和take实现了一个分页例程.它工作得很好,但在调用Take和Skip之前我需要表中的记录总数.

我知道我可以提交2个单独的查询.

  1. 得到数数
  2. 跳过并采取

但我宁愿不向LINQ发出2次调用.

如何在同一查询中返回它(例如使用嵌套的select语句)?

以前,我在存储过程中使用了分页技术.我使用临时表返回了项目,并将计数传递给输出参数.

Ste*_*ven 8

对不起,但你做不到.至少,不是一个漂亮的方式.

你可以用不合适的方式做到这一点,但我认为你并不喜欢这样:

var query = from e in db.Entities where etc etc etc;

var pagedQuery = 
    from e in query.Skip(pageSize * pageNumber).Take(pageSize)
    select new
    {
        Count = query.Count(),
        Entity = e
    };
Run Code Online (Sandbox Code Playgroud)

你看?根本不漂亮.

  • 它仍然是对数据库的两个查询.如果你在LINQ查询中足够眯眼,它看起来只有一个查询.;-) (4认同)
  • 实际上,这段代码实际上根本不会导致数据库查询.只有迭代`pagedQuery`,才会调用数据库.它还取决于LINQ提供程序,但是一个好的提供程序将把它作为一个单一的数据库查询运行.某些提供商可能会执行N + 1个查询.此外,执行两个单独的查询(计数和结果查询)可能会比这个更好的性能.正如我所说,它不是很漂亮. (3认同)
  • 我认为正确的查询是`query.Skip(pageSize*pageNumber).Take(pageSize)` (2认同)