Как привести результат динамического запроса Linq как пользовательский класс? - PullRequest
5 голосов
/ 29 марта 2010

Обычно я делаю это:

var a = from   p in db.Products
        where  p.ProductType == "Tee Shirt"
        group  p by p.ProductColor into g
        select new Category { 
               PropertyType = g.Key,
               Count = g.Count() }

Но у меня есть такой код:

var a = Products
        .Where("ProductType == @0", "Tee Shirt")
        .GroupBy("ProductColor", "it")
        .Select("new ( Key, it.Count() as int )");

Какой синтаксис можно изменить, чтобы получить идентичные результаты, т. Е. Как сделать проекцию Category из второго оператора Linq?

Я знаю, что g и it одинаковы и представляют всю запись таблицы, и что Я вытягиваю всю запись только для подсчета , Мне тоже нужно это исправить. Редактировать: Марсело Кантос отметил, что Linq достаточно умен, чтобы не извлекать ненужные данные. Спасибо!

1 Ответ

1 голос
/ 29 марта 2010

Зачем тебе вообще это делать? Поскольку после вызова GroupBy у вас все еще есть вся информация, вы можете легко сделать это:

var a = Products
        .Where("ProductType == @0", "Tee Shirt")
        .GroupBy("ProductColor", "it")
        .Select(c => new Category { 
            PropertyType = g.Key, Count = g.Count() 
        });

Тип продуктов по-прежнему должен проходить и быть доступным, а обычные группировки / фильтрация не должны изменять тип, который проходит через методы расширения.

...