我使用skip和take实现了一个分页例程。它工作得很好,但在调用Take和Skip之前我需要表中的记录总数。
我知道我可以提交2个单独的查询。
但我不想向LINQ发出2次调用。
如何在同一查询中返回它(例如使用嵌套的select语句)?
以前,我在存储过程中使用了分页技术。我使用临时表返回了项目,并将计数传递给输出参数。
答案 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
}
);