2010-03-29 5 views
5

Normalmente, hago esto:Cómo convertir un resultado de consulta dinámica de Linq como una clase personalizada?

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

Pero tengo código como este:

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

Qué sintaxis podría alterar para producir resultados idénticos, es decir, ¿cómo puedo hacer una proyección de Categoría de la segunda declaración Linq?

sé en tanto que g y que son los mismos y representan todo el registro de la tabla, y que estoy tirando el registro completo en tan sólo para hacer un recuento. Necesito arreglar eso también. Editar: Marcelo Cantos señaló que Linq es lo suficientemente inteligente como para no obtener datos innecesarios. ¡Gracias!

+1

¿Has verificado que en realidad estás tirando todo el registro? No conozco el LINQ dinámico en absoluto, pero no veo por qué no podría ser tan inteligente acerca de esto como LINQ-to-SQL estático. –

+0

Creo que Cantos tiene razón sobre cuánto tira. –

Respuesta

1

¿Por qué tendrías que hacerlo? Puesto que todavía tiene toda la información después de la llamada GroupBy, usted puede hacer esto:

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

el tipo de productos todavía debe fluir a través y ser accesible y las agrupaciones regulares/filtrado no debe mutar el tipo que está fluyendo a través de los métodos de extensión.

+1

Me sorprendería si el resultado de una consulta dinámica tuviera algo más que un método de selección de consulta dinámica disponible, tomando solo un parámetro de cadena, no una lambda. Esto es, por supuesto, a menos que me falta algo obvio. –

+0

En otras palabras, después de .GroupBy(), la única selección disponible es. Seleccione cuál es la versión de Dynamic Query (menos la Lambda). –

+1

El error específico que recibo al hacerlo es "No se puede convertir la expresión lambda para escribir 'cadena' porque no es un tipo de delegado. Mi código era var a = Products.GroupBy (" ProductColor "," it "). Select (c => nuevo {nombre = ((Productos) c) .ProductName}); Sin embargo, si utilizo un foreach anidado (IGrouping b en a) {foreach (Productos c en b) {// crear a List manual}}, esto funciona bastante bien. Extrae los valores y los establece en una variable de memoria diferente, pero al menos es una forma. –

Cuestiones relacionadas