c#linq使用其他列值查询聚合数据

本文关键字:查询 数据 其他 c#linq | 更新日期: 2024-10-18 15:06:13

这是我的环境。

我有一个具有这种结构的数据表

IDstring|Attrib1|Attrib2|Attrib3|Attrib4|值

我需要按attrib元素导出平均值、最大值、最小值组,我使用以下代码:

        var queryTable = from rows in dataTable.AsEnumerable()
                         group rows by new
                         {
                             Attrib1 = rows["Attrib1"],
                             Attrib2 = rows["Attrib2"],
                             Attrib3 = rows["Attrib3"],
                             Attrib4 = rows["Attrib4"]
                         } into grp
                         select new
                         {
                             Attrib1 = grp.Key.Attrib1,
                             Attrib2 = grp.Key.Attrib2,
                             Attrib3 = grp.Key.Attrib4,
                             Attrib4 = grp.Key.Attrib14,
                             Avg = grp.Average(s => Convert.ToDouble(s["Value"])),
                             Min = grp.Min(s => Convert.ToDouble(s["Value"])),
                             Max = grp.Max(s => Convert.ToDouble(s["Value"])),
                             Count = grp.Count()
                         };

如果我还需要导出一个匹配最大值和最小值的IDstring(不必全部出现),我该怎么做

我已经尝试过对原始数据表的onquerytable结果的每个max和min元素使用另一个linq查询,但对于我所拥有的元素数量来说太慢了。你能帮我吗?

c#linq使用其他列值查询聚合数据

在代码编码器的大力帮助下,这可能是解决方案:首先,我按Value排序,然后取第一个和最后一个元素。

        var queryTable = from rows in resultTable.AsEnumerable()
                         orderby rows.Field<double>("Value")
                         group rows by new
                         {
                             Attrib1 = rows["Attrib1"],
                             Attrib2 = rows["Attrib2"],
                             Attrib3 = rows["Attrib3"],
                             Attrib4 = rows["Attrib4"]
                         } into grp
                         select new
                         {
                             Attrib1 = grp.Key.Attrib1,
                             Attrib2 = grp.Key.Attrib2,
                             Attrib3 = grp.Key.Attrib3,
                             Attrib4 = grp.Key.Attrib4,
                             Avg = grp.Average(s => Convert.ToDouble(s["Value"])),
                             Min = grp.Min(s => Convert.ToDouble(s["Value"])),
                             IDStringMin = grp.First().Field<string>("IDstring"),
                             Max = grp.Max(s => Convert.ToDouble(s["Value"])),
                             IDStringMax = grp.Last().Field<string>("IDstring"),
                             Count = grp.Count()
                         };