Jak mogę wybrać opcję SELECT UNIQUE z LINQ?

96

Mam taką listę:

Red
Red
Brown
Yellow
Green
Green
Brown
Red
Orange

Próbuję zrobić SELECT UNIQUE z LINQ, tj. Chcę

Red
Brown
Yellow
Green
Orange

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

Następnie zmieniłem to na

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

bez sukcesu. Pierwsza selectpobiera WSZYSTKIE kolory, więc jak mogę ją zmodyfikować, aby uzyskać tylko unikalne wartości?

Jeśli istnieje lepszy sposób na ustrukturyzowanie tego zapytania, z przyjemnością podążę tą drogą.

Jak mam go edytować, żeby móc .OrderBy( "column name" )np. Alfabetycznie według nazwy koloru, więc nazwać właściwość?

Ciągle otrzymuję wiadomość:

Nie można wywnioskować argumentów typu na podstawie użycia. Spróbuj jawnie określić argumenty typu.

baron
źródło

Odpowiedzi:

159

Distinct()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);
James Curran
źródło
3
Dzięki, to jest poprawna odpowiedź. Czy ktoś może wyjaśnić, co się dzieje w parametrach .OrderBy (). Masz imię => imię. Czy ta nazwa pochodzi z nazwy kolumny w bazie danych? Ponieważ mamy dbo.Color.Namewięc tylko name=>namepodpowiedzi, to nie jest nazwa kolumny? Dziwne, to też się układa poprawnie, jeśli zmienię to na.OrderBy(a=>a)
baron
3
Nazwa zmiennej nie ma znaczenia. To po prostu {obiekt przekazany do funkcji} => {obiekt używany do sortowania}. Ponieważ dokonaliśmy już wyboru, jedyną rzeczą w sortowanej kolekcji są nazwy.
James Curran
Dzięki @JamesCurran, Twoje rozwiązanie bardzo mi pomogło.
Ron
Wydaje się, że byłoby miło, gdyby istniała metoda OrderedBy () do porządkowania całego obiektu / rekordu. Metoda rozszerzająca nadal będzie wywoływać delegata bez powodu.
NetMage
@NetMage - wyjaśnij, co masz na myśli mówiąc „cały obiekt / rekord”. Każde pole? W jakiej kolejności? Zawiera klucz podstawowy?
James Curran
20
var uniqueColors = (from dbo in database.MainTable 
                    where dbo.Property == true
                    select dbo.Color.Name).Distinct();
jwendl
źródło
10

Korzystając ze składni rozumienia zapytań, możesz uzyskać kolejność w następujący sposób:

var uniqueColors = (from dbo in database.MainTable
                    where dbo.Property
                    orderby dbo.Color.Name ascending
                    select dbo.Color.Name).Distinct();
cordialgerm
źródło
Hmm ... to nie osiągnęło sortowania alfabetycznego - z jakiegoś powodu ... Zmieniłem rosnąco i malejąco i otrzymałem ten sam wynik. Czy to wyraźne stwierdzenie ma na to wpływ? może potem trzeba go zamówić?
baron
Można spróbować var ​​uniqueColors = z wyniku w (z dbo w database.MainTable, gdzie dbo.Property wybierz dbo.Color.Name) .Distinct () kolejność według wyniku rosnąco;
cordialgerm