将 IQueryable 转换为 IOrderedQueryable

本文关键字:IOrderedQueryable 转换 IQueryable | 更新日期: 2023-09-27 18:36:29

我有2个表:项目和项目指标。项目包含我的项目,项目度量包含有关这些项目的统计信息。

我正在尝试按相应的统计权重对项目列表进行排序。我使用子查询让它工作,但我认为它有点效率低下,可以优化......

items.OrderBy(item => (from metric in Context.ItemMetrics where item.ItemId == metric.ItemId select metric.Weight).FirstOrDefault());

。所以我正在尝试使用连接来完成同样的事情......

from item in items join metric in ItemMetrics on item.ItemId equals metric.ItemId orderby metric.Weight select item;

这在 LINQPad 中工作正常。我需要返回一个 IOrderedQueryable 以获得一个补充方法,以使用 Skip 和 Take 进行一些分页,但编译器告诉我这个查询的结果是 IQueryable。

我能想到明确暗示IOrderedQueryable的唯一方法是将查询包装在

OrderBy(x => 0)

有没有更好的方法?

将 IQueryable 转换为 IOrderedQueryable

问题是IOrderedQueryable需要能够应用辅助排序 - 当您将项目/指标对投影到一个项目时,您已经丢失了主要排序。

一种方法是将投影推迟到以后:

var ordered = items.Join(ItemMetrics,
                         item => item.ItemId,
                         metric => metric.ItemId,
                         (item, metric) => new { item, metric })
                   .OrderBy(pair => pair.Metric.Weight);
var paged = ApplyPaging(ordered, pageConfiguration); // Whatever
var query = paged.Select(pair => pair.Item);

这是假设ApplyPaging(或您使用的任何内容)返回IQueryableIOrderedQueryable

相关文章:
  • 没有找到相关文章