【发布时间】:2016-02-26 13:08:26
【问题描述】:
我有以下查询部分(这是更大查询的结尾 - queryBuilder 是一个 IQueryable)
var results = queryBuilder
.OrderBy(x => x.Vehicle.RangeId)
.ThenBy(x => x.Rate.Rental)
.GroupBy(x => x.Vehicle.RangeId)
.Select(x => x.FirstOrDefault())
.OrderBy(x => x.Rate.Rental);
它使用具有 Vehicle 对象和 Rental 对象的对象。大约有 12,000 辆车,分为大约 40 个范围(RangeId - Indexed int 规定了这一点)。
上面的查询工作正常,但没有达到我的预期。我希望它先按 RangeId 订购车辆,然后按租金(最低租金优先)。
然后按 RangeId 对它们进行分组,并从组中选择第一个,这“应该”是最便宜的租金,因为它在调用 groupby 之前被订购。
但是。它不是。它只是随机得到一个,没有顺序。有时它是第二便宜的。有时第 5 次等等。出于某种原因,GroupBy 不遵守原始订单!
我可以通过执行以下操作来完成这项工作。 但是表现绝对糟糕,需要很长时间才能完成。
var results = queryBuilder
.OrderBy(x => x.Vehicle.RangeId)
.ThenBy(x => x.Rate.Rental)
.GroupBy(x => x.Vehicle.RangeId)
.Select(x => x.OrderBy(o => o.Rate.Rental).FirstOrDefault())
.OrderBy(x => x.Rate.Rental);
任何帮助或指针将不胜感激。我无法弄清楚为什么原始查询没有保持一切井井有条。
【问题讨论】:
-
先尝试使用 GroupBy,然后对各个组进行排序。也应该提高性能
-
这就是我在第二个示例中所做的,不是吗?这方面的表现很糟糕。
-
我应该补充一下,我已经尝试删除 GroupBy 之前的所有订单查询,但这对糟糕的性能没有影响。
-
在顶部查询中,我认为是 Select 错误。您可以尝试使用 SelectMany(x => x.FirstOrDefault()) 吗?
-
那时我不能这么多选择。 VS 抛出错误,无法编译。
标签: entity-framework linq-to-entities entity-framework-6