J'essaie d'utiliser .distinct dans Linq pour obtenir un résultat basé sur un champ de la table (donc ne nécessite pas un ensemble d'enregistrements dupliqués de la table).
Je sais écrire une requête de base en utilisant distinct comme suit:
var query = (from r in table1
orderby r.Text
select r).distinct();
mais j'ai besoin de résultats où r.text
n'est pas dupliqué.
Réponses:
Essaye ça:
Cela regroupera la table
Text
et utilisera la première ligne de chaque groupe, ce qui donnera des lignes oùText
est distinct.la source
table1.GroupBy(x => new { x.Text, x.Property2, x.Property3 }).Select(x => x.First());
GroupBy
ne crée pas de groupes vides, voir mon commentaire précédent. Très probablement, votre code contient plus que ce que vous voyez ici. Peut-être que vous avez unWhere
aussi ou une condition pour leFirst
.MoreLinq a une méthode DistinctBy que vous pouvez utiliser:
Cela vous permettra de faire:
L'implémentation de la méthode (à court de validation d'argument) est la suivante:
la source
GroupBy
faut un aussi. Les deux méthodes utiliseront la valeur par défautEqualityComparer
si aucune n'est fournie.On dirait que vous voulez ceci:
Cela sélectionnera les lignes où le
Text
est unique.la source
La réponse de Daniel Hilgarth ci-dessus conduit à une
System.NotSupported
exception avec Entity-Framework . Avec Entity-Framework , il faut:la source
Il y a beaucoup de discussions autour de ce sujet.
Vous pouvez en trouver un ici :
L'une des suggestions les plus populaires a été la méthode Distinct prenant une expression lambda comme paramètre, comme @Servy l'a souligné.
L'architecte en chef de C #, Anders Hejlsberg, a proposé ici la solution . Expliquant également pourquoi l'équipe de conception du framework a décidé de ne pas ajouter une surcharge de méthode Distinct qui prend un lambda.
la source
D'après ce que j'ai trouvé, votre requête est généralement correcte. Il suffit de changer "select r" en "select r.Text" est tout et cela devrait résoudre le problème. C'est ainsi que MSDN a documenté son fonctionnement.
Ex:
la source
la source
essayez ce code:
la source
Vous pouvez essayer ceci:
table1.GroupBy(t => t.Text).Select(shape => shape.r)).Distinct();
la source