Comment puis-je faire SELECT UNIQUE avec LINQ?

96

J'ai une liste comme celle-ci:

Red
Red
Brown
Yellow
Green
Green
Brown
Red
Orange

J'essaye de faire un SELECT UNIQUE avec LINQ, c'est-à-dire que je veux

Red
Brown
Yellow
Green
Orange

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

J'ai ensuite changé cela en

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

sans succès. Le premier selectobtient TOUTES les couleurs, alors comment puis-je le modifier pour obtenir uniquement les valeurs uniques?

S'il existe un meilleur moyen de structurer cette requête, plus qu'heureux d'emprunter cette voie.

Comment puis-je l'éditer pour pouvoir avoir .OrderBy ("nom de colonne") c'est-à-dire par ordre alphabétique par nom de couleur, donc propriété de nom?

Je continue de recevoir un message:

Les arguments de type ne peuvent pas être déduits de l'utilisation. Essayez de spécifier explicitement les arguments de type.

baron
la source

Réponses:

159

Le Distinct () va gâcher l'ordre, vous devrez donc effectuer le tri après cela.

var uniqueColors = 
               (from dbo in database.MainTable 
                 where dbo.Property == true 
                 select dbo.Color.Name).Distinct().OrderBy(name=>name);
James Curran
la source
3
Merci, c'est la bonne réponse. Quelqu'un peut-il expliquer ce qui se passe dans les paramètres .OrderBy (). Vous avez nom => nom. Ce nom provient-il du nom de la colonne dans la base de données? Parce que nous avons dbo.Color.Namealors juste name=>namequels indices pour moi ce n'est pas le nom de la colonne? Bizarre, ça trie aussi correctement si je change ça en.OrderBy(a=>a)
baron
3
Le nom de la variable n'est pas pertinent. C'est juste {objet passé à la fonction} => {objet utilisé pour trier}. Puisque nous avons déjà fait la sélection, la seule chose dans la collection qui est triée est les noms.
James Curran
Merci @JamesCurran, votre solution m'a beaucoup aidé.
Ron
On dirait que ce serait bien s'il y avait un OrderedBy () pour le tri par objet / enregistrement entier. Une méthode d'extension appellerait toujours un délégué sans raison.
NetMage
@NetMage - clarifiez ce que vous entendez par "l'objet / l'enregistrement entier". Chaque champ? Dans quel ordre? Y compris la clé primaire?
James Curran
20
var uniqueColors = (from dbo in database.MainTable 
                    where dbo.Property == true
                    select dbo.Color.Name).Distinct();
jwendl
la source
10

En utilisant la syntaxe de compréhension des requêtes, vous pouvez effectuer l'ordre comme suit:

var uniqueColors = (from dbo in database.MainTable
                    where dbo.Property
                    orderby dbo.Color.Name ascending
                    select dbo.Color.Name).Distinct();
cordialgerm
la source
Hmm ... cela n'a pas atteint un tri alphabétique - pour une raison quelconque ... J'ai basculé en montant et en descendant et j'ai obtenu le même résultat. La déclaration distincte l'affecte-t-elle? peut-être doit-il être commandé après cela?
baron
Pourrait essayer var uniqueColors = from result in (from dbo in database.MainTable où dbo.Property select dbo.Color.Name) .Distinct () orderby result croissant;
cordialgerm