欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > 用linq和sqlsugar 聚类的对比

用linq和sqlsugar 聚类的对比

2024/10/23 12:39:33 来源:https://blog.csdn.net/helldoger/article/details/142934468  浏览:    关键词:用linq和sqlsugar 聚类的对比

例如我现在有个需求, 焊接机器人生产 “封头” 和 “支座” 2种产品, 每次生产完毕, 机器人发信号给PLC ,记录一次生产类型, 完成时间等属性. 我们需要把这些产品 按日期+小时, 分段统计出 每个小时 各种类型的产品产量. 并用echart 用柱状图展示出来, 每小时一组.

如果用linq 是这么做

假设我们有以下原始数据:

List<Product> list1 = new List<Product>
{new Product { Time = new DateTime(2024, 10, 12, 10, 0, 0), ProductType = "A" },new Product { Time = new DateTime(2024, 10, 12, 10, 0, 0), ProductType = "B" },new Product { Time = new DateTime(2024, 10, 12, 11, 0, 0), ProductType = "A" },new Product { Time = new DateTime(2024, 10, 12, 11, 0, 0), ProductType = "A" },new Product { Time = new DateTime(2024, 10, 13, 10, 0, 0), ProductType = "A" },new Product { Time = new DateTime(2024, 10, 13, 10, 0, 0), ProductType = "B" },
};

第一次分组

var groupedData = list1.GroupBy(p => new { p.Time.Date, p.Time.Hour, p.ProductType }).Select(g => new {Date = g.Key.Date,Hour = g.Key.Hour,Type = g.Key.ProductType,Count = g.Count()}).ToList();

那结果会是:

[{ Date = 2024-10-12, Hour = 10, Type = A, Count = 1 },{ Date = 2024-10-12, Hour = 10, Type = B, Count = 1 },{ Date = 2024-10-12, Hour = 11, Type = A, Count = 2 },{ Date = 2024-10-13, Hour = 10, Type = A, Count = 1 },{ Date = 2024-10-13, Hour = 10, Type = B, Count = 1 }
]

第二次分组:

var echartData = groupedData.GroupBy(item => new { item.Date, item.Hour }).Select(group =>new{DateHour = $"{group.Key.Date:yyyy-MM-dd} {group.Key.Hour}:00",ACount = group.FirstOrDefault(x => x.Type == "A")?.Count ?? 0,BCount = group.FirstOrDefault(x => x.Type == "B")?.Count ?? 0}).OrderBy(item => item.DateHour).ToList();

结果是:

[{ DateHour = "2024-10-12 10:00", ACount = 1, BCount = 1 },{ DateHour = "2024-10-12 11:00", ACount = 2, BCount = 0 },{ DateHour = "2024-10-13 10:00", ACount = 1, BCount = 1 }
]

在第一次分组后,每个分组只包含一种类型(A或B),并且每个分组内的Count表示该类型在该时间点的数量。
在第二次分组时,我们将这些分组按Date和Hour重新组合,并分别计算A和B的数量。
使用FirstOrDefault方法来查找特定类型的数量,如果没有找到,则返回0。
这样,最终生成的echartData将包含每个小时段内A和B类型的数量,其中至少有一个值为0。这样可以确保每个时间段都有完整的A和B类型的统计数据。

如果是sqlsugar, 需要用sugar 自己的窗口函数 sqlfanuc:

var list = db.Queryable<Student>().GroupBy(it => new { it.Id, it.Name }) //可以多字段.Where(it=>it.Id>0)//普通过滤//.Having(it => SqlFunc.AggregateCount(it.Id) > 0)//聚合函数过滤.Select(it => new { idAvg = SqlFunc.AggregateAvg(it.Id??0),count = SqlFunc.AggregateCount(it.Id),  name = it.Name }).ToList();

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com