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

时间:2010-11-25 10:17:53

标签: c# linq linq-to-sql count subquery

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

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

  1. 获取点数
  2. 跳过并拍摄
  3. 但我不想向LINQ发出2次调用。

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

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

2 个答案:

答案 0 :(得分: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
    };
你知道吗?根本不漂亮。

答案 1 :(得分:0)

没有理由进行两个单独的查询甚至存储过程。使用let绑定来记录子查询完成后,您可以使用包含所选项目和总计数的匿名类型。对数据库的单个查询,1个linq表达式和你完成的。获取值为jobQuery.Select(x => x.item)或jobQuery.FirstOrDefault()。计数

让表达是一件了不起的事。

var jobQuery = (
                from job in jc.Jobs
                let jobCount = (
                                    from j in jc.Jobs
                                    where j.CustomerNumber.Equals(CustomerNumber)
                                    select
                                        j
                                ).Count()
                where job.CustomerNumber.Equals(CustomerNumber)
                select
                new
                {
                    item = job.OrderBy(x => x.FieldName).Skip(0).Take(100),
                    Count = jobCount
                }
            );