我有一个带有左连接的查询:
var query = (from v in context.Vehicles
//left join vehicleAttributes
join va in context.VehicleAttributes on v.VehicleId equals va.VehicleId into vAttributes
from vehicleAttributes in vAttributes.DefaultIfEmpty()
where v.FleetId == fleetId
select new { v, vehicleAttributes });
现在我需要对其进行分页。
这有效,但获取所有行,比我实际需要的多得多
query.ToList().Select(x => x.v).Distinct().Skip(10 * (page - 1)).Take(10).ToList();
这是我尝试过的,但现在我没有联合值
query.Select(x => x.v).Distinct().ToList().Skip(10 * (page - 1)).Take(10).ToList();
ToList() 会触发对数据库的调用,因此您只需在应用 Skip 和 Take 后执行此操作。 您还需要一个 OrderBy 子句。
你应该能够做这样的事情:
var data = (from v in context.Vehicles
join va in context.VehicleAttributes on v.VehicleId equals va.VehicleId into vAttributes
from vehicleAttributes in vAttributes.DefaultIfEmpty()
where v.FleetId == fleetId
select new { v, vehicleAttributes })
.OrderBy(p => p.v.FleetId)
.Skip(10 * (page - 1))
.Take(10)
.ToList();
请勿在
ToList
之前致电Skip
。这样做将返回数据库中与您的查询匹配的所有记录。
要在 EntityFramework 查询上使用
Skip
,您需要有 IOrderedQueryable
的实例,因此需要一个 OrderBy
子句。
query
.Select(x => x.v)
.Distinct()
.OrderBy(v => v.FleetId)
.Skip(10 * (page - 1))
.Take(10).ToList();
我有一个项目可以处理很多这样的功能。它可以在 NuGet(带有
MVC
对应)和 Google Code 上使用。
使用它看起来像这样:
var factory = new Pagination.PageSourceFactory {
MaxItemsPerPage = 50,
DefaultItemsPerPage = 20
};
var source = factory.CreateSource(query, page);