EntityFramework对具有连接的查询进行分页

时间:2013-06-11 14:53:17

标签: entity-framework join paging

我有一个左连接的查询:

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

任何想法?

由于

2 个答案:

答案 0 :(得分:6)

ToList()触发对数据库的调用,因此您只需在应用Skip and 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();

答案 1 :(得分:0)

请勿在{{1​​}}之前致电ToList。这样做将返回数据库中与您的查询匹配的所有记录。

要在EntityFramework查询中使用Skip,您需要拥有Skip的实例,因此需要IOrderedQueryable子句。

OrderBy

我有一个项目负责很多这个功能。它位于NuGetquery .Select(x => x.v) .Distinct() .OrderBy(v => v.FleetId) .Skip(10 * (page - 1)) .Take(10).ToList(); counterpart)和Google Code

使用它看起来像这样:

MVC