2010-08-19 11 views
89

que tienen una lista como esta:¿Cómo puedo hacer SELECCIONAR ÚNICO con LINQ?

Red 
Red 
Brown 
Yellow 
Green 
Green 
Brown 
Red 
Orange 

que estoy tratando de hacer una ÚNICA SELECT 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(); 

con sin éxito. El primer select obtiene TODOS los colores, entonces ¿cómo lo modifico solo para obtener los valores únicos?

Si hay una mejor manera de estructurar esta consulta, más que feliz de ir por esa ruta.

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

sigo recibiendo un mensaje:

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

Respuesta

148

El Distinct() va a estropear el pedido, por lo que tendrá a la clasificación después de eso .

var uniqueColors = 
       (from dbo in database.MainTable 
       where dbo.Property == true 
       select dbo.Color.Name).Distinct().OrderBy(name=>name); 
+3

Gracias, esta es la respuesta correcta. ¿Alguien puede explicar qué incluye los parámetros .OrderBy()? Tienes nombre => nombre. ¿Ese nombre proviene del nombre de la columna en el DB? Porque tenemos 'dbo.Color.Name' luego simplemente' name => name' que me sugiere que no es el nombre de la columna? Bizarre también ordena correctamente si simplemente lo cambio a '.OrderBy (a => a)' – baron

+3

El nombre de la variable es irrelevante. Es solo {objeto pasado a la función} => {objeto usado para ordenar}. Como ya hemos hecho la selección, lo único que se ordena en la colección son los nombres. –

+0

Gracias a @JamesCurran, tu solución me ayudó mucho. – Ron

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

+1, pero le sugiero que utilice un bloque de código para el código de –

10

Utilizando la sintaxis comprensión de consulta que podría lograr el OrdenarPor de la siguiente manera:

var uniqueColors = (from dbo in database.MainTable 
        where dbo.Property 
        orderby dbo.Color.Name ascending 
        select dbo.Color.Name).Distinct(); 
+0

Hmm ... que no alcanzaron una especie alfabético - por alguna razón ... Cambié que suben y bajan y obtuve el mismo resultado. ¿La declaración distinta lo afecta? tal vez deba ser ordenado por después de eso? – baron

+0

podría intentar uniqueColors var = de resultado en (de DBO en database.MainTable donde dbo.Property seleccionar dbo.Color.Name) .Distinct() orderby resultado ascendente; – cordialgerm

Cuestiones relacionadas