C# 将IQueryable转换为IOrderedQueryable

C# 将IQueryable转换为IOrderedQueryable,c#,linq,join,C#,Linq,Join,我有两个表:Items和ItemMetrics。Items包含我的项目,ItemMetrics包含关于这些项目的统计信息 我试图根据相应的统计权重对项目列表进行排序。 我使用子查询让它工作,但我认为它有点低效,可以优化 items.OrderBy(item => (from metric in Context.ItemMetrics where item.ItemId == metric.ItemId select metric.Weight).FirstOrDefault()); …所

我有两个表:Items和ItemMetrics。Items包含我的项目,ItemMetrics包含关于这些项目的统计信息

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

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工作得很好。我需要为Supplymentary方法返回一个IOrderedQueryable,以使用Skip和Take进行一些分页,但是编译器告诉我这个查询的结果是一个IQueryable

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

OrderBy(x => 0)

有更好的方法吗?

问题是,
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
(或您正在使用的任何东西)返回
IQueryable
IOrderedQueryable
,谢谢。一个问题:将结果强制转换为IOrderedQueryable安全吗?我以前没有这样做,因为我以前有过“跳过”和“接受投诉”的经历,但在发布后,我只是把它作为一个猜测添加进去,它就起作用了。@DavidJamesBall:Cast哪个结果?你最初查询的那个?老实说,我很惊讶这能起作用。。。我个人不会依赖它,因为它目前听起来是一个方便的实现细节。如果我的方法行得通,我会用它来代替。