2008-11-09 23 views
5

datos de la tabla de 2 columnas "categoría" y "subcategoría"consultas linq anidadas, ¿cómo obtener valores distintos?

quiero conseguir una colección de "categoría", [] subcategorías utilizando el código de abajo me sale duplicados. Poner .Distinct() después de "desde" externo no ayuda mucho. ¿Qué extraño?

var rootcategories = (from p in sr.products 
           orderby p.category 
            select new 
            { 
             category = p.category, 
             subcategories = (
             from p2 in sr.products 
             where p2.category == p.category 
             select p2.subcategory).Distinct() 
            }).Distinct(); 

sr.products ve así

category subcategory 
---------------------- 
cat1  subcat1 
cat1  subcat2 
cat2  subcat3 
cat2  subcat3 

lo que me pasa en los resultados es

cat1, [subcat1,subcat2] 
cat1, [subcat1,subcat2] 

pero yo sólo quería una entrada

resolvió mi problema con este código:

var rootcategories2 = (from p in sr.products 
           group p.subcategory by p.category into subcats 

           select subcats); 

ahora tal vez es hora de pensar en lo que era la pregunta correcta .. (-:

Respuesta

5

solucionar con este código

var rootcategories2 = (from p in sr.products 
           group p.subcategory by p.category into subcats 

           select subcats); 

gracias a todos

3

Creo que se necesita 2 llamadas "distintas()", uno de las principales categorías y otro para las subcategorías.

Esto debería funcionar para usted:

var mainCategories = (from p in products select p.category).Distinct(); 

var rootCategories = 
    from c in mainCategories 
    select new { 
     category = c, 
     subcategories = (from p in products 
         where p.category == c 
         select p.subcategory).Distinct() 
    }; 
+1

Nota a la libre: aprender a usar más groupbys próxima vez. – chakrit

1

Su consulta principal está en los productos, por lo que vamos a obtener los registros para cada producto. Cambie de lugar para consultar Categoría, pero filtrando en Product.Category

2

El algoritmo detrás de Distinct() necesita una forma de saber si 2 objetos en la fuente IEnumerable son iguales. El método predeterminado para eso es comparar 2 objetos por referencia y, por lo tanto, es probable que no haya 2 objetos "iguales" ya que los está creando con la palabra clave "nueva".

Lo que tienes que hacer es escribir una clase personalizada que implemente IEnumerable y pasarla a la llamada Distinct().

Cuestiones relacionadas