簡體   English   中英

通過linq查詢按數據表的多列(動態)分組

[英]group by multiple columns (Dynamically) of datatable by linq Query

我想通過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個列名,我想像for循環一樣動態訪問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查詢對我來說是新的。

您可以按字典分組並通過自定義比較器:

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

多虧了ChaseMedallion,我才能進行動態分組。 Equals方法還不夠,我還必須將GetHashCode添加到MyComparer中:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM