c# - 如何使用 LINQ 进行双重分组
问题描述
在下面的数据中,我想为每个唯一父级查找有多少个唯一订单
[Fact]
public void Test()
{
var data = new Order[]
{
new Order(){ ParentID =1,ParentName ="Parent 1", OrderID = 11 },
new Order(){ ParentID =1,ParentName ="Parent 1", OrderID = 11 },
new Order(){ ParentID =1,ParentName ="Parent 1", OrderID = 11 },
new Order(){ ParentID =1,ParentName ="Parent 1", OrderID = 22 },
new Order(){ ParentID =1,ParentName ="Parent 1", OrderID = 22 },
new Order(){ ParentID =1,ParentName ="Parent 1", OrderID = 22 },
new Order(){ ParentID =2,ParentName ="Parent 2", OrderID = 33 },
new Order(){ ParentID =2,ParentName ="Parent 2", OrderID = 33 },
new Order(){ ParentID =2,ParentName ="Parent 2", OrderID = 33 },
new Order(){ ParentID =2,ParentName ="Parent 2", OrderID = 44 },
new Order(){ ParentID =2,ParentName ="Parent 2", OrderID = 44 },
new Order(){ ParentID =2,ParentName ="Parent 2", OrderID = 55 },
new Order(){ ParentID =2,ParentName ="Parent 2", OrderID = 55 },
};
var queryResult = data
.GroupBy(x => x.OrderID)
.Select(x => new
{
x.First().ParentID,
x.First().ParentName,
})
.ToList();
var result = queryResult.GroupBy(x => new { x.ParentID, x.ParentName })
.Select(x => new Result()
{
ParentID = x.Key.ParentID,
ParentName = x.Key.ParentName,
Count = x.Count()
})
.ToList();
Assert.Equal(2, result.Count);
var firstParent = result.Where(x => x.ParentID == 1).SingleOrDefault();
Assert.Equal(2, firstParent.Count);
var secondParent = result.Where(x => x.ParentID == 2).SingleOrDefault();
Assert.Equal(3, secondParent.Count);
}
上面的代码正在运行。但我想检查是否有更好的方法(优化)来做到这一点。数据可能有 1000+ 条记录
解决方案
我想为每个独特的父母找到有多少独特的订单
很简单,获取所有订单,按其父级对它们进行分组(无论您如何识别它们),然后计算这些组(具有唯一OrderId
字段的那些)中的不同订单。
var result =
(from o in data
group o.OrderId by new { o.ParentId, o.ParentName } into g
select new Result
{
ParentId = g.Key.ParentId,
ParentName = g.Key.ParentName,
Count = g.Distinct().Count(),
})
.ToList();
推荐阅读
- mongodb - 将mongo查询转换为spring查询
- python - tensorflow.gradients 给出 None 值
- macos - 在 OS X 终端中运行时,aiodns 无法联系 DNS 服务器错误
- css - 如何用 css 覆盖一个类?
- javascript - 钩子之前的摩卡没有在套件之前运行
- python - Python:根据变量名称动态命名数据框的自定义函数
- libgdx - 多个屏幕的 Gdx.input.setInputProcessor。(LIBGDX,概念)
- python - 错误: (-215:Assertion failed) s >= 0 in function 'cv::setSize' using LBPHFaceRecognizer
- windows - 在 Windows 上加载加密模块时出错
- objective-c - 按顺序复制视图的正确方法(如 tableView 中的单元格)