【发布时间】:2015-01-27 17:59:08
【问题描述】:
是否可以创建一个 linq to entity 查询,它可以为我提供查询中事物的总数以及其中一些项目的列表?
例如,如果查询不受约束将返回 40,000 个项目,但我只想要 500 个项目的第 5 页,则对象会说 Count = 40,000 和 List<items> 将只包含 500 个项目。
【问题讨论】:
标签: c# linq entity-framework linq-to-entities
是否可以创建一个 linq to entity 查询,它可以为我提供查询中事物的总数以及其中一些项目的列表?
例如,如果查询不受约束将返回 40,000 个项目,但我只想要 500 个项目的第 5 页,则对象会说 Count = 40,000 和 List<items> 将只包含 500 个项目。
【问题讨论】:
标签: c# linq entity-framework linq-to-entities
这里的代码返回特定客户的订单数量,然后是这些订单的“页面”。 (这将检索订单 501 到 600。)
Customer[] CustomerList;
int CustomerID;
var x = CustomerList
.Where(r => r.CustomerID == CustomerID)
.Select(r => new {
OrderCount = r.Orders.Count(),
OrderPageList = r.Orders.Skip(500).Take(100).ToArray() });
int totalCount = x.OrderCount;
Order[] orderList = x.OrderPageList;
【讨论】:
是的,这是可能的(这里的另一个例子:Better way to query a page of data and get total count in entity framework 4.1?),但不推荐。它通常需要人为的查询构造来获取一个 LINQ 语句中的计数和数据(大卫的回答通过仅选择子项来规避这一点)。
您最好创建一个IQueryable 并分别获取其计数和分页子集。
更好的是,将PagedList 添加到您的项目中并使用如下代码:
var prd = Products.Where(p => p.Categories.Any(c => c.CategoryName == "Sports" ));
var page = prd.OrderBy(p => p.Name).ToPagedList(5,500);
这只是执行计数和Skip/Take 查询以获取包含 500 个项目的所有页面的第 5 页。
结果,IPagedList<T>,是一个IEnumerable<T>,它具有一些有用的属性,例如HasNextPage 或PageCount。
【讨论】: