Wie kann ich mit LINQ SELECT UNIQUE ausführen?

96

Ich habe eine Liste wie diese:

Red
Red
Brown
Yellow
Green
Green
Brown
Red
Orange

Ich versuche mit LINQ eine SELECT UNIQUE zu machen, dh ich möchte

Red
Brown
Yellow
Green
Orange

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

Ich habe das dann geändert in

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

ohne Erfolg. Der erste selecterhält ALLE Farben. Wie ändere ich ihn also, um nur die eindeutigen Werte zu erhalten?

Wenn es eine bessere Möglichkeit gibt, diese Abfrage zu strukturieren, gehen Sie gerne diesen Weg.

Wie bearbeite ich es, damit ich .OrderBy ("Spaltenname") haben kann, dh alphabetisch nach Farbnamen, also Namenseigenschaft?

Ich bekomme immer wieder eine Nachricht:

Die Typargumente können nicht aus der Verwendung abgeleitet werden. Versuchen Sie, die Typargumente explizit anzugeben.

Baron
quelle

Antworten:

159

Das Distinct () wird die Bestellung durcheinander bringen, also müssen Sie danach sortieren.

var uniqueColors = 
               (from dbo in database.MainTable 
                 where dbo.Property == true 
                 select dbo.Color.Name).Distinct().OrderBy(name=>name);
James Curran
quelle
3
Danke, das ist die richtige Antwort. Kann jemand bitte erklären, was in den .OrderBy () -Parametern steht. Sie haben Name => Name. Kommt dieser Name vom Spaltennamen in der Datenbank? Weil wir dbo.Color.Namedann nur name=>namewelche Hinweise für mich haben, ist es nicht der Spaltenname? Bizarr sortiert es auch richtig, wenn ich das einfach in.OrderBy(a=>a)
Baron
3
Der Name der Variablen ist irrelevant. Es ist nur {Objekt in Funktion übergeben} => {Objekt zum Sortieren verwendet}. Da wir die Auswahl bereits durchgeführt haben, werden nur die Namen in der Sammlung sortiert.
James Curran
Danke @JamesCurran, deine Lösung hat mir sehr geholfen.
Ron
Es scheint schön zu sein, wenn es ein OrderedBy () für die Bestellung nach dem gesamten Objekt / Datensatz gäbe. Eine Erweiterungsmethode würde weiterhin ohne Grund einen Delegaten aufrufen.
NetMage
@NetMage - Klären Sie, was Sie unter "dem gesamten Objekt / Datensatz" verstehen. Jedes Feld? In welcher Reihenfolge? Einschließlich des Primärschlüssels?
James Curran
20
var uniqueColors = (from dbo in database.MainTable 
                    where dbo.Property == true
                    select dbo.Color.Name).Distinct();
jwendl
quelle
10

Mit der Syntax des Abfrageverständnisses können Sie die Reihenfolge wie folgt erreichen:

var uniqueColors = (from dbo in database.MainTable
                    where dbo.Property
                    orderby dbo.Color.Name ascending
                    select dbo.Color.Name).Distinct();
Cordialgerm
quelle
Hmm ... das hat keine alphabetische Sortierung erreicht - aus irgendeinem Grund ... Ich habe aufsteigend und absteigend gewechselt und das gleiche Ergebnis erzielt. Beeinflusst die eindeutige Aussage dies? Vielleicht muss es danach bestellt werden?
Baron
Könnte versuchen, var uniqueColors = from result in (von dbo in database.MainTable wobei dbo.Property dbo.Color.Name auswählen) .Distinct () orderby result ascending;
Cordialgerm