2013-11-18 2 views
0

У меня есть данные списка (не указан указанный тип) и имя свойства (в строке). Как мне группировать базу данных списка по имени свойства?Групповые данные с общим типом

+0

ли вам знать тип собственности? Либо в терминах фактического типа ('string' и т. Д.), Либо в терминах' T'? –

+0

Аналогичным образом вы не являетесь элементом списка элементов списка, т. Е. Является списком List , и вы просто не знаете T во время компиляции (т. Е. Ваш метод является общим) или это список только IList? –

ответ

1

Это решение будет работать, если тип полностью неизвестен (то есть его не просто список в обобщенной функции)

Вот вспомогательный класс с функцией полезности.

public static class HelperClass { 
    public static object GetProperty(this object source, string name) { 
    if (source == null) return null; 
    var pi = source.GetType().GetProperty(name); 
    if (pi == null) return null; 
    return pi.GetValue(source); 
    } 
} 

Теперь при условии, что у вас есть список ваших данных в vaiable называется myList и имя свойства в name:

var groupedResults = myList.Cast<object>().GroupBy(x => x.GetProperty(name)); 

В ролях() гарантирует, что вы используете IEnumerable, где Т объект, так что расширение GroupBy будет работать.

Если же вы работаете с List<T> где специфическим T является обобщенным аргументом (т.е. вы не знаете, что T является string, но вы знаете, что его общий аргумент T есть альтернативные решения, которые могут быть построены с использованием выражения. Это позволило бы использовать против IQueryables, которые должны правильно перевести с вашего поддерживаемого источника данных SQL.

static class HelperClass { 

    static Expression<Func<T,object>> GroupByExpression<T>(string propertyName) { 
    var parameter = Expression.Parameter(typeof(T),"x"); 
    var body = Expression.Property(parameter,propertyName); 
    return Expression.Lambda<Func<T,object>>(Expression.Convert(body, typeof(object)), parameter); 
    } 
} 

Это теперь можно использовать с одновременно IQuerable<T> и IList<T>

так что если вы находитесь внутри родовой функции, где T соответствует T в IList<T> вы можете использовать

где myList является IQueryable<T>:

myList.GroupBy(HelperClass.GroupByExpression<T>(name)) 

и где myList является IList<T> или IEnumerable<T>

myList.GroupBy(HelperClass.GroupByExpression<T>(name).Compile()) 
Смежные вопросы