¿Cómo puedo hacer SELECT UNIQUE con LINQ?

96

Tengo una lista como esta:

Red
Red
Brown
Yellow
Green
Green
Brown
Red
Orange

Estoy tratando de hacer un SELECT UNIQUE con LINQ, es decir, quiero

Red
Brown
Yellow
Green
Orange

var uniqueColors = from dbo in database.MainTable
                   where dbo.Property == true
                   select dbo.Color.Name;

Luego cambié esto a

var uniqueColors = from dbo in database.MainTable
                   where dbo.Property == true
                   select dbo.Color.Name.Distinct();

sin éxito. El primero selectobtiene TODOS los colores, entonces, ¿cómo lo modifico para obtener solo los valores únicos?

Si hay una mejor manera de estructurar esta consulta, más que feliz de seguir ese camino.

¿Cómo hago para editarlo para poder tener .OrderBy ("nombre de columna"), es decir, alfabéticamente por nombre de color, así que nombrar propiedad?

Sigo recibiendo un mensaje:

Los argumentos de tipo no se pueden inferir del uso. Intente especificar los argumentos de tipo explícitamente.

barón
fuente

Respuestas:

159

Distinct () va a estropear el orden, por lo que tendrá que ordenar después de eso.

var uniqueColors = 
               (from dbo in database.MainTable 
                 where dbo.Property == true 
                 select dbo.Color.Name).Distinct().OrderBy(name=>name);
James Curran
fuente
3
Gracias, esta es la respuesta correcta. ¿Alguien puede explicar qué va en los parámetros .OrderBy ()? Tienes nombre => nombre. ¿Ese nombre proviene del nombre de la columna en la base de datos? Porque tenemos dbo.Color.Nameentonces lo name=>nameque me sugiere que no es el nombre de la columna. Extraño, también se ordena correctamente si lo cambio a.OrderBy(a=>a)
barón
3
El nombre de la variable es irrelevante. Es solo {objeto pasado a función} => {objeto usado para ordenar}. Como ya hicimos la selección, lo único que se ordena en la colección son los nombres.
James Curran
Gracias @JamesCurran, tu solución me ayudó mucho.
Ron
Parece que sería bueno si hubiera un OrderedBy () para ordenar por todo el objeto / registro. Un método de extensión seguiría llamando a un delegado sin ningún motivo.
NetMage
@NetMage: aclara lo que quieres decir con "todo el objeto / registro". ¿Cada campo? ¿En qué orden? ¿Incluyendo la clave principal?
James Curran
20
var uniqueColors = (from dbo in database.MainTable 
                    where dbo.Property == true
                    select dbo.Color.Name).Distinct();
jwendl
fuente
10

Usando la sintaxis de comprensión de consultas, podría lograr el orden de la siguiente manera:

var uniqueColors = (from dbo in database.MainTable
                    where dbo.Property
                    orderby dbo.Color.Name ascending
                    select dbo.Color.Name).Distinct();
cordial germen
fuente
Hmm ... eso no logró un tipo alfabético - por alguna razón ... cambié de ascenso y descenso y obtuve el mismo resultado. ¿Lo está afectando la declaración distinta? ¿Quizás necesita ser ordenado después de eso?
barón
Podría probar var uniqueColors = from result in (from dbo in database.MainTable donde dbo.Property seleccione dbo.Color.Name) .Distinct () orderby result ascendente;
cordialgerm