2010-03-29 3 views
5

Обычно я делаю это:Как передать результат динамического запроса Linq как пользовательский класс?

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

Что синтаксис я мог бы изменить для получения одинаковых результатов, то есть, как это сделать проекцию категории из второго заявления Linq?

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

+1

Вы подтвердили, что на самом деле вы тянете всю запись? Я вообще не знаю динамического LINQ, но я не понимаю, почему это не может быть столь же умным, как статический LINQ-to-SQL. –

+0

Я думаю, что Cantos правильно говорит о том, сколько он тянет. –

ответ

1

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

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

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

+1

Я был бы удивлен, если бы результат динамического запроса имел бы что-либо, кроме доступного метода динамического запроса, используя только строковый параметр, а не лямбда. Это, конечно, если я не пропущу что-то очевидное. –

+0

Другими словами, после .GroupBy() доступен только выбранный выбор. Выберите, какая версия Dynamic Query (минус Lambda). –

+1

Конкретная ошибка, которую я получаю при этом: «Невозможно преобразовать лямбда-выражение для ввода« string », потому что это не тип делегата. Мой код был var a = Products.GroupBy (« ProductColor »,« it »). => new {name = ((Products) c) .ProductName}); Однако, если я использую вложенный foreach (IGrouping b in a) {foreach (Продукты c в b) {// create Список вручную}}, тогда это работает очень хорошо, оно извлекает значения и устанавливает их в другую переменную памяти, но по крайней мере это способ. –

Смежные вопросы