2010-03-29 17 views
5

Normalnie, mogę to zrobić:Jak przesłać wynik zapytania dynamicznego Linq jako niestandardową klasę?

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() } 

Ale mam kod jak poniżej:

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

Co składnia mogę zmienić, aby produkować takie same wyniki, to znaczy, jak to zrobić projekcję Kategorii z drugiego zdania Linq?

Wiem, że zarówno w g i to są takie same i reprezentują całą rekord tabeli, a ja ciągnąc cały rekord w tylko zrobić liczyć. Też muszę to naprawić. Edytuj: Marcelo Cantos zwrócił uwagę, że Linq jest wystarczająco inteligentny, aby nie wyciągać niepotrzebnych danych. Dzięki!

+1

Czy zweryfikowałeś, że faktycznie wyciągasz cały rekord? Nie znam dynamicznego LINQ w ogóle, ale nie rozumiem, dlaczego nie byłoby tak inteligentne w tym, jak statyczne LINQ-SQL. –

+0

Myślę, że Cantos ma rację co do tego, ile on ciągnie. –

Odpowiedz

1

Dlaczego miałbyś to zrobić w ogóle? Ponieważ nadal masz wszystkie informacje, po wywołaniu GroupBy, można łatwo to zrobić:

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

typu produktów powinna nadal przepływać przez i być dostępne i regularne zgrupowania/filtrowanie nie powinno mutować typ, który przepływa przez metody rozszerzenia.

+1

Byłbym zdziwiony, gdyby wynik zapytania dynamicznego nie miał dostępu do wybranej metody dynamicznego wyboru zapytań, biorąc pod uwagę tylko parametr łańcuchowy, a nie lambda. Jest tak oczywiście, chyba że brakuje mi czegoś oczywistego. –

+0

Innymi słowy, po .GroupBy() jedynym dostępnym wyborem jest. Wybierz wersję dynamiczną (bez Lambdy). –

+1

Specyficznym błędem, który robię, jest "Nie mogę przekonwertować wyrażenia lambda na typ", ponieważ nie jest to typ delegata. Mój kod był var a = Products.GroupBy ("ProductColor", "it"). => nowy {nazwa = ((produkty) c) .ProductName}); Jednak jeśli użyję zagnieżdżonego foreach (IGrouping b w a) {foreach (Produkty c w b) {// create List ręcznie}}, to działa całkiem nieźle, wyodrębnia wartości i ustawia je w innej zmiennej pamięci, ale przynajmniej jest to sposób. –

Powiązane problemy