EntityFramework 使用连接对查询进行分页

问题描述 投票:0回答:2

我有一个带有左连接的查询:

   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();
entity-framework join pagination
2个回答
7
投票

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();

0
投票

请勿在

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);
© www.soinside.com 2019 - 2024. All rights reserved.