通过linq Query按数组(动态)分组

时间:2013-07-04 13:13:19

标签: c# linq

我希望通过linq查询按数据表中的多个列进行分组。

我试过这样,

var _result = from row in tbl.AsEnumerable()

group row by new
{
    id=row.Field<object>(_strMapColumn),
    value=row.Field<object>(_strValueColumn),
} into g
select new
{
    _strMapColumn = g.Key.id,
    ToolTip = g.Sum(r => grp.Sum(r => r.Field<Double>(__strToolTip[1]))),
};

它的工作正常。我的问题是我在strToolTip数组中有10个列名,我想动态访问10个列名,就像for循环一样吗?

我想要这样

select new
{_strMapColumn = g.Key.id,

   for(int index = 1; index <= 10; index++)
   {    
       ToolTip+index = g.Sum(r => getDoubleValue(r.Field<Double>(__strToolTip[1])))
   }   
};

并且还想动态添加数据类型请提供解决此问题的答案。 linq查询对我来说是新的。

2 个答案:

答案 0 :(得分:0)

您可以按字典分组并传递自定义比较器:

public class MyComparer : IEqualityComparer<Dictionary<string, object>> {
    public bool Equals(Dictionary<string, object> a, Dictionary<string, object> b) {
        if (a == b) { return true; }
        if (a == null || b == null || a.Count != b.Count) { return false; }
        return !a.Except(b).Any();
    }
}

IEnumerable<string> columnsToGroupBy = ...
var rows = tbl.AsEnumerable();
var grouped = rows.GroupBy(r => columnsToGroupBy.ToDictionary(c => c, c => r[c]), new MyComparer());
var result = grouped.Select(g => {
    // whatever logic you want with each grouping
    var id = g.Key["id"];
    var sum = g.Sum(r => r.Field<int>("someCol"));
});

答案 1 :(得分:0)

感谢ChaseMedallion,我得到了动态分组工作。 Equals方法还不够,我还必须将GetHashCode添加到MyComparer

public int GetHashCode(Dictionary<string, object> a)
{
    return a.ToString().ToLower().GetHashCode();
}