2013-07-04 3 views
0

Я хочу группировать по нескольким столбцам в datatable по запросу linq.группа по нескольким столбцам (динамически) от datatable по linq Query

я пытался, как это,

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]))), 
}; 

его отлично работает. мой вопрос: у меня есть 10 имен столбцов в массиве strToolTip. Я хочу получить доступ к десятизначным именам столбцов динамически, как для цикла, возможно ли это?

я хочу, как этот

select new 
{_strMapColumn = g.Key.id, 

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

, а также хотят, чтобы добавить DATATYPE Динамически пожалуйста, любезно дать ответ для решения этой проблемы. запрос 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, я получил динамическую группировку работает. Равно метод не был достаточно, мне пришлось добавить GetHashCode к MyComparer, а также:

public int GetHashCode(Dictionary<string, object> a) 
{ 
    return a.ToString().ToLower().GetHashCode(); 
} 
Смежные вопросы