2010-03-29 7 views
5

Normalmente, fare questo:Come trasmettere un risultato Linq Dynamic Query come una classe personalizzata?

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

Ma ho codice come questo:

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

Cosa sintassi ho potuto alterare a produrre risultati identici, vale a dire, come faccio a fare una proiezione di categoria dalla seconda affermazione di Linq?

so sia che g e si sono uguali e rappresentano l'intero record della tabella, e che sto tirando l'intero record in solo per fare un conteggio. Devo aggiustare anche quello. Modifica: Marcelo Cantos ha sottolineato che Linq è abbastanza intelligente da non tirare dati non necessari. Grazie!

+1

Hai verificato che stai effettivamente trascinando l'intero record? Non conosco affatto LINQ dinamico, ma non vedo perché non possa essere altrettanto intelligente su questo come LINQ-to-SQL statico. –

+0

Penso che Cantos abbia ragione su quanto tira. –

risposta

1

Perché dovresti farlo? Dal momento che avete ancora tutte le informazioni dopo la chiamata GroupBy, si può facilmente fare questo:

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

il tipo di prodotti dovrebbe essere ancora fluire attraverso ed essere accessibile e il raggruppamenti regolari/filtraggio non dovrebbe mutare il tipo che sta scorrendo attraverso i metodi di estensione.

+1

Sarei sorpreso se il risultato di una query dinamica avesse solo un metodo di selezione di query dinamiche disponibile, prendendo solo un parametro stringa, non un lambda. Questo è, naturalmente, a meno che mi manchi qualcosa di ovvio. –

+0

In altre parole, dopo .GroupBy() l'unica selezione disponibile è. Seleziona quale è la versione di Query dinamica (meno la Lambda). –

+1

L'errore specifico che ottengo è "Impossibile convertire l'espressione lambda in" string "perché non è un tipo delegato. Il mio codice era var a = Products.GroupBy (" ProductColor "," it "). Select (c => new {name = ((Prodotti) c) .ProductName}); Tuttavia, se utilizzo un foreach nidificato (IGrouping b in a) {foreach (Prodotti c in b) {// create una lista manualmente}}, quindi funziona abbastanza bene, estrae i valori e li imposta in una variabile di memoria diversa, ma almeno è un modo. –

Problemi correlati