【问题标题】:EntityFramework do Paging on a query with a joinEntityFramework 对带有连接的查询进行分页
【发布时间】:2013-06-11 14:53:16
【问题描述】:

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

   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 paging


【解决方案1】:

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

【讨论】:

  • 是的,我知道 ToList() 调用数据库,但我该如何解决这个问题?我试过这个: query.Select(x => x.v).Distinct().ToList().Skip(10 * (page - 1)).Take(10).ToList();但是我不会得到联合值,因为我每辆车得到不止一行,因为它有很多属性......
【解决方案2】:

不要在Skip 之前调用ToList。这样做将返回数据库中与您的查询匹配的所有记录。

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

query
    .Select(x => x.v)
    .Distinct()
    .OrderBy(v => v.FleetId)
    .Skip(10 * (page - 1))
    .Take(10).ToList();

我有一个项目可以处理很多此类功能。它在NuGet(带有MVC counterpart)和Google Code 上可用。

使用它看起来像这样:

var factory = new Pagination.PageSourceFactory {
    MaxItemsPerPage = 50,
    DefaultItemsPerPage = 20
};
var source = factory.CreateSource(query, page);

【讨论】:

  • 感谢您的回答,但您的建议不起作用,因为由于加入,我每辆车获得多于一排...如果我按照您说的做,我将无法获得联合值。 ..
猜你喜欢
  • 2019-11-14
  • 2012-08-19
  • 1970-01-01
  • 2023-04-07
  • 2023-03-14
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
相关资源
最近更新 更多