2013-04-15 2 views
1

У меня есть таблица данных «Автомобиль», у которой есть 3 cols (владелец, carType, цвет). Мой вопрос в том, как сделать часть группировки более динамичной, используя отражение. моя идея - добавить группировку col в массив, а затем использовать отражение в части группировки запросов. Однако я был поражен на отражении ..Группа Linq с использованием отражения

var gcols = new string[] { "owner", "carType" };       
var reseult = dt.AsEnumerable() 
        .GroupBy(x => new 
        { 
         carType = x.Field<string>("carType"), 
         colour = x.Field<string>("colour") 
        }) 
        .Select(x => new 
        { 
         CarType = x.Key.carType, 
         Colour = x.Key.colour, 
         count = x.Count() 
        }) 
        .OrderBy(x => x.CarType).ToList(); 
+0

Что именно вы пытаетесь сделать? Каков ожидаемый результат? –

+1

Похож на [this] (http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/39028ad2-452e-409f-bc9e-d1b263e921f6/)? – I4V

+0

что я хочу сделать, это динамическая группировка на основе столбцов в массиве gcols вместо жесткого кода группировка col в запросе – Jack

ответ

1

Если вы добавили этот метод расширения объекта:

public static T Field<T>(this object source, string FieldName) 
    { 
     var type = source.GetType(); 
     var field = type.GetField(FieldName); 
     return (T)field.GetValue(source); 
    } 

Вы были бы в состоянии использовать синтаксис, размещенный в коде.

Я не добавил здесь никаких проверок безопасности, поэтому вам потребуется очистка, но вам это поможет. В идеале вы хотите проверить, что тип field совпадает с T и несколькими другими чеками.

+0

Можно ли показать, как применить его к моему коду? что я должен пройти в источнике? Таблица данных ? – Jack

+0

Это метод расширения - он добавляет метод «Поле» ко всем объектам, поэтому вы просто помещаете его куда угодно, и он должен работать с точным кодом, который вы указали выше. – PhonicUK

+0

не работает. во время выполнения источник ссылается на нуль – Jack