Como posso fazer SELECT UNIQUE com LINQ?


96

Eu tenho uma lista como esta:

Red
Red
Brown
Yellow
Green
Green
Brown
Red
Orange

Estou tentando fazer um SELECT UNIQUE com LINQ, ou seja, quero

Red
Brown
Yellow
Green
Orange

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

Eu então mudei isso para

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

sem sucesso. O primeiro selectobtém TODAS as cores, então como faço para modificá-lo para obter apenas os valores exclusivos?

Se houver uma maneira melhor de estruturar essa consulta, mais do que feliz em seguir esse caminho.

Como faço para editá-lo para que possa ter .OrderBy ("nome da coluna"), ou seja, em ordem alfabética por nome de cor, então propriedade de nome?

Eu sempre recebo uma mensagem:

Os argumentos de tipo não podem ser inferidos do uso. Tente especificar os argumentos de tipo explicitamente.

Respostas:


159

O Distinct () vai bagunçar a ordem, então você terá que fazer a classificação depois disso.

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

3
Obrigado, esta é a resposta correta. Alguém pode explicar o que se passa nos parâmetros .OrderBy (). Você tem nome => nome. Esse nome vem do nome da coluna no banco de dados? Porque temos dbo.Color.Nameentão apenas o name=>nameque sugere para mim não é o nome da coluna? Bizarro também classifica corretamente se eu mudar para.OrderBy(a=>a)
barão

3
O nome da variável é irrelevante. É apenas {objeto passado para a função} => {objeto usado para classificar}. Como já fizemos o Select, a única coisa na coleção que está sendo classificada são os nomes.
James Curran de

Obrigado @JamesCurran, sua solução me ajudou muito.
Ron,

Parece que seria bom se houvesse um OrderedBy () para ordenar por todo o objeto / registro. Um método de extensão ainda estaria chamando um delegado sem motivo.
NetMage

@NetMage - esclareça o que você quer dizer com "o objeto / registro inteiro". Cada campo? Em que ordem? Incluindo a chave primária?
James Curran

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

10

Usando a sintaxe de compreensão de consulta, você pode obter a ordem da seguinte maneira:

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

Hmm ... isso não atingiu uma classificação alfabética - por algum motivo ... eu mudei de ascendente e descendente e obtive o mesmo resultado. A declaração distinta está afetando isso? talvez precise ser encomendado por depois disso?
barão

Pode tentar var uniqueColors = from result in (from dbo in database.MainTable onde dbo.Property seleciona dbo.Color.Name) .Distinct () orderby result ascending;
cordialgerm
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.