2013-07-04 208 views
0

我想通过linq查询在数据表中按多列进行分组。group by 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个列名称动态像循环是可能的吗?

我想这样

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查询对我来说是新的。

回答

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")); 
}); 
0

感谢ChaseMedallion,我得到了动态分组工作。 等于方法是不够的,我不得不增加GetHashCodeMyComparer以及:

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