2010-08-19 8 views
89

Mam listę takiego:Jak mogę wybrać SELECT UNIQUE z LINQ?

Red 
Red 
Brown 
Yellow 
Green 
Green 
Brown 
Red 
Orange 

staram się zrobić SELECT wyjątkowy z LINQ, czyli chcę

Red 
Brown 
Yellow 
Green 
Orange 

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

Potem zmienił to

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

z bez powodzenia. Pierwszy select otrzymuje WSZYSTKIE kolory, więc jak mogę go zmodyfikować, aby uzyskać tylko unikalne wartości?

Jeśli istnieje lepszy sposób na skonstruowanie tego zapytania, z przyjemnością przejdziemy tę trasę.

W jaki sposób mogę go edytować, aby móc mieć .OrderBy ("nazwa kolumny"), tj. Alfabetycznie według nazwy koloru, a więc nazwę?

Wciąż otrzymuję komunikat:

Argumenty typu nie można wywnioskować z użytkowania. Spróbuj jawnie sprecyzować argumenty typu.

Odpowiedz

148

Wyraźną() będzie bałagan zamawiania, więc będziesz mieć do sortowania po tym .

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

Dzięki, to jest poprawna odpowiedź. Czy ktoś może wyjaśnić, co dzieje się w parametrach .OrderBy(). Masz nazwę => imię. Czy ta nazwa pochodzi od nazwy kolumny w DB? Ponieważ mamy 'dbo.Color.Name' to po prostu' name => name', które podpowiada mi, że to nie jest nazwa kolumny? Dziwacznie to również sortuje się poprawnie, jeśli po prostu zmienię to na '.OrderBy (a => a)' – baron

+3

Nazwa zmiennej jest nieistotna. To tylko {obiekt przekazany do funkcji} => {obiekt używany do sortowania}. Ponieważ już zrobiliśmy Select, jedyną rzeczą w sortowanym zbiorze są nazwy. –

+0

Dzięki @JamesCurran, twoje rozwiązanie bardzo mi pomogło. – Ron

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

+1 ale proponuję użyć blok kodu do kodu –

10

Korzystanie rozumienia składni kwerendy można osiągnąć orderby następująco:

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

hmm ... że nie osiągnięcia alfabetycznego sortowania - z jakiegoś powodu ... przeszedłem rosnąco i malejąco i dostał ten sam rezultat. Czy wpływa na to odrębne oświadczenie? może po tym trzeba go uporządkować? – baron

+0

może próbować uniqueColors zmienna = od wyniku w (od dbo w database.MainTable gdzie dbo.Property wybrać dbo.Color.Name) .Distinct() orderby wynik rosnącym; – cordialgerm