- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个查询的以下部分(这是一个更大查询的结尾 - 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);
如有任何帮助或指点,我们将不胜感激。我无法弄清楚为什么原始查询没有让一切井井有条。
最佳答案
I expect for it to order the vehicles by RangeId and then by rental
在 LINQ to Entities 查询中,GroupBy
之前的任何排序都将被忽略。您甚至不会在执行的 SQL 中看到它。这是因为 Entity Framework 将分组表达式作为排序依据(在您的例子中为 x => x.Vehicle.RangeId
)。这是为什么?
LINQ 的GroupBy
与SQL 的GROUP BY
看似相似,实则大不相同。
GROUP BY
是“破坏性的”,我的意思是 GROUP BY
中的列以外的任何信息都会丢失(聚合表达式除外)。如果你这样做......
SELECT Brand, COUNT(*)
FROM Cars
GROUP BY Brand
...您只能看到 Brand
及其数量。您看不到分组中的汽车。
这正是 LINQ 的 GroupBy
所做的:它生成完整 对象组。原始数据中的所有信息仍然存在。您会看到按品牌分组的汽车。
这意味着将 GroupBy
转换为 GROUP BY
的 ORM 给自己构建结果集带来了困难。 LINQ to SQL 就是这样做的。它首先执行 GROUP BY
查询,然后需要单独的查询(实际上每个组一个)来弥补“丢失”的数据。
EF 以不同方式实现 GroupBy
。它在一个查询中获取所有数据,然后在内存中构建组。您不会在生成的 SQL 中看到 GROUP BY
。您看到的是 ORDER BY
。我认为 EF 更喜欢排序的 SQL 查询结果,以便在内存中进行更高效的处理。 (而且我可以想象与管道中的其他 LINQ 语句结合得更好)。
这就是为什么 GroupBy
之前的任何排序都被忽略的原因。以及为什么只能在分组后应用排序。
the performance is absolutely dire
从这里很难说这是为什么。也许你可以在内存中进行排序:
var results = queryBuilder
.GroupBy(x => x.Vehicle.RangeId)
.Select(x => x.OrderBy(o => o.Rate.Rental).FirstOrDefault())
.Select(o => new { o.Rate.Rental, o }
.AsEnumerable()
.OrderBy(x => x.Rental);
但这也可能是一个索引问题。如果 Rate.Rental
上没有合适的索引,则按该列排序的成本很高。
关于entity-framework - Entity Framework v6 GroupBy 丢失原始顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33887784/
给定输入: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 将数字按奇数或偶数分组,然后按小于或大于 5 分组。 预期输出: [[1, 3, 5], [2, 4], [6, 8, 10
编辑: @coldspeed、@wen-ben、@ALollz 指出了我在字符串 np.nan 中犯的新手错误。答案很好,所以我不删除这个问题来保留那些答案。 原文: 我读过这个问题/答案 What'
我试图概括我提出的问题 here . mlb 数据框看起来像 Player Position Salary Year 0 Mike Wit
我认为我不需要共享整个数据框,但基本上,这是有问题的代码行(当然,已经导入了 pandas) divstack = df[df['Competitor']=='Emma Slabach'].group
我面临下一个问题:我有组(按 ID),对于所有这些组,我需要应用以下代码:如果组内位置之间的距离在 3 米以内,则需要将它们添加在一起,因此将创建一个新组(代码如何创建我在下面显示的组)。现在,我想要
我有以下数据: ,dateTime,magnitude,occurrence,dateTime_s 1,2017-11-20 08:00:09.052260,12861,1,2017-11-20 08
我按感兴趣的列对 df 进行分组: grouped = df.groupby('columnA') 现在我只想保留至少有 5 名成员的组: grouped.filter(lambda x: len(x
数据是一个时间序列,许多成员 ID 与许多类别相关联: data_df = pd.DataFrame({'Date': ['2018-09-14 00:00:22',
选择 u.UM_TOKEN_NO 、u.UM_FULLNAME、u.SECTOR、u.department_name、t.TS_PROJECT_CODE、sum(t.TS_TOTAL_HRS) 来自
我有这两个表: +---------------+-------------+---------------------+----------+---------+ | items_ordered |
我正在使用 groupby 和 sum 快速汇总两个数据集 一个包含: sequence shares 1 100 2 200 3 50 1 2
这个问题在这里已经有了答案: list around groupby results in empty groups (3 个答案) itertools groupby object not out
我有一组行,我想按标识符的值进行分组 - 存在于每一行中 - 然后对将作为结果的组进行进一步的隔离处理。 我的数据框是这样的: In [50]: df Out[50]: groupkey b
假设您要在全局范围内销售产品,并且希望在某个主要城市的某个地方设立销售办事处。您的决定将完全基于销售数字。 这将是您的(简化的)销售数据: df={ 'Product':'Chair', 'Count
我有一个将数据分组两次的查询: var query = (from a in Context.SetA() from b in Context.SetB().Where(x => x.aId == a
我有一个这种格式的数据框: value identifier 2007-01-01 0.087085 55 2007-01-01 0.703249
这个问题在这里已经有了答案: python groupby behaviour? (3 个答案) 关闭 4 年前。 我有一个这样的列表 [u'201003', u'200403', u'200803
在 Python 中,我可以使用 itertools.groupby 将具有相同键的连续元素分组。 : >>> items = [(1, 2), (1, 5), (1, 3), (2, 9), (3,
无法翻译以下 GroupBy 查询并将引发错误:不支持客户端 GroupBy IEnumerable ids = new List { 1, 2, 3 }; var q = db.Comments.W
考虑一个 Spark DataFrame,其中只有很少的列。目标是对其执行 groupBy 操作,而不将其转换为 Pandas DataFrame。等效的 Pandas groupBy 代码如下所示:
我是一名优秀的程序员,十分优秀!