LINQ GroupBy分组返回错误结果,求原因分析
问题解答:Linq GroupBy 后未返回预期数据的原因
场景还原
先看你的测试数据:
| userid | UserApproveLevel_Two_T |
|---|---|
| 1118bda4-6cba-43d6-a0cd-555555555555 | True |
| 22299872-aa01-498a-831d-555555555555 | False |
| 333a8ddb-d261-47d9-8ec8-555555555555 | False |
你写的代码:
var sky = DB.UserSkypeTrackers.GroupBy(x => x.UserApproveLevel_Two_T == true).FirstOrDefault(); foreach (var item in sky ) { // 此处看到的结果是: //22299872-aa01-498a-831d-555555555555 //333a8ddb-d261-47d9-8ec8-555555555555 }
你预期拿到UserApproveLevel_Two_T = True的那条数据,但实际返回了False的集合,这是怎么回事?
问题原因
核心问题出在GroupBy和FirstOrDefault的组合使用上:
- 你用
x.UserApproveLevel_Two_T == true作为分组键,这会把数据分成两个组:- 键为
true的组:只包含那条UserApproveLevel_Two_T为True的数据 - 键为
false的组:包含另外两条False的数据
- 键为
FirstOrDefault()是取分组后的第一个组,但Linq的GroupBy并不保证分组的顺序(不管是内存集合还是EF查询数据库时,分组顺序都依赖底层实现,没有固定规则)。你的情况里,恰好键为false的组被排在了前面,所以FirstOrDefault取到了这个组。
解决方法
如果你只是想筛选出UserApproveLevel_Two_T = True的数据,完全不需要用GroupBy,直接用Where更高效:
var sky = DB.UserSkypeTrackers.Where(x => x.UserApproveLevel_Two_T == true); foreach (var item in sky) { // 这里会拿到你预期的那条数据 }
如果因为某些场景必须用GroupBy,那你要明确指定取键为true的组,而不是依赖顺序:
var sky = DB.UserSkypeTrackers.GroupBy(x => x.UserApproveLevel_Two_T == true) .FirstOrDefault(g => g.Key == true);
这样就能精准拿到你想要的分组了。
内容的提问来源于stack exchange,提问作者cirtizumle
相关产品推荐
相关产品推荐

