GroupBy 后转为 Dictionary
分组后可以用 ToDictionary 把结果转成字典,分组键作为 Key,组内数据作为 Value。
static void Main(string[] args)
{
using (var dbContext = new DataClasses1DataContext())
{
// 分组键 → Dictionary<Key, Dictionary<ID, User>>
var q = dbContext.User
.GroupBy(m => m.Name)
.ToDictionary(
m => m.Key, // 分组键(Name)作为外层字典的 Key
m => m.ToDictionary(a => a.ID) // 组内每条记录转成以 ID 为 Key 的字典
);
var list = q.ToList();
// 分组键 → Dictionary<Key, IGrouping>
var q2 = dbContext.User
.GroupBy(m => m.Name)
.ToDictionary(m => m.Key);
var list2 = q2.ToList();
}
}Code language: JavaScript (javascript)
结果结构:
| 写法 | 字典类型 | Value 内容 |
|---|---|---|
ToDictionary(m => m.Key, m => m.ToDictionary(a => a.ID)) | Dictionary<string, Dictionary<int, User>> | 外层按 Name 分组,内层每个分组按 ID 索引 User |
| `ToDictionary(m => m.Key)“ | Dictionary<string, IGrouping<string, User>> | Value 是分组对象,可遍历 |
访问方式:
// 取"张三"组下 ID=1 的用户
User u = q["张三"][1];
// 遍历"张三"组所有用户
foreach (var user in q2["张三"])
{
Console.WriteLine(user.Name);
}Code language: PHP (php)
关键要点:
| 要点 | 说明 |
|---|---|
ToDictionary | 在内存中执行,需先 ToList/GroupBy 完成查询 |
| 分组键重复 | 如果分组键有重复值,ToDictionary 会抛异常 |
| Value 类型 | 可以是 List<T>、Dictionary<K,V> 或 IGrouping |
m.ToDictionary(a => a.ID) | 组内每条记录以 ID 为 Key 转字典,ID 重复会报错 |
| 执行顺序 | 先数据库端 GROUP BY 查回数据,再客户端 ToDictionary |
变体写法:
// Value 直接存为 List
var dict = dbContext.User
.GroupBy(m => m.Name)
.ToDictionary(
m => m.Key,
m => m.ToList() // Value 是 List<User>
);Code language: JavaScript (javascript)
字典 Key 重复时会抛
ArgumentException,确保分组键唯一或提前处理。
Previous: DefaultIfEmpty 处理空集合聚合
Next: 分组后把字段收集到 List 中