我有2个表: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中运行良好。我需要返回一个IOrderedQueryable作为补充方法,使用Skip和Take进行一些分页,但编译器告诉我这个查询的结果是IQueryable。
我能想到明确暗示IOrderedQueryable的唯一方法是将查询包装在
中OrderBy(x => 0)
有更好的方法吗?
答案 0 :(得分:3)
问题是IOrderedQueryable
需要能够应用辅助排序 - 当您将项目/指标对投影到某个项目时,您就丢失了主要排序。< / p>
一种方法是将预测推迟到以后:
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
。