2012-01-13 3 views
1

Je dois sélectionner des enregistrements distincts dans une table de données en utilisant linq et C# et je n'arrive pas à obtenir la syntaxe correcte. J'ai le code suivant, qui renvoie toutes les lignes dans une table de données, comment est-ce que je renvoie juste des lignes DISTINCT?Sélectionnez Distinct from DataTable à l'aide de Linq et C#

DataTable dt = ds.Tables[0]; 
var q = from dr in dt.AsEnumerable() select dr; 

Répondre

1
(from dr in dt.AsEnumerable() select dr).Distinct(); 
+0

Cela a du sens pour moi aussi, ce que référence qui me manque? J'obtiens l'erreur suivante: Erreur 'System.Data.EnumerableRowCollection ' ne contient pas de définition pour 'Distinct' et aucune méthode d'extension 'Distinct' acceptant un premier argument de type 'System. Data.EnumerableRowCollection 'peut être trouvé (manque-t-il une directive using ou une référence d'assembly?) –

+0

La réponse de vc 74 est correcte. – Matt

2

Nous aurions pu:

var q = (from dr in dt.AsEnumerable() select dr).Distinct(DataRowComparer.Default); 

Mais vraiment, le from x in ... select x est redondant, donc nous pouvons avoir:

var q = dt.AsEnumerable().Distinct(DataRowComparer.Default); 

Mais AsEnumerable() ferons la plupart du temps , est soit rien (si c'est déjà en tant que tel) ou potentiellement des choses lentes (si distinctes peuvent être traitées b etter ailleurs), il est donc préférable de le faire normalement:

var q = dt.Distinct(DataRowComparer.Default); 

Bien qu'il y ait des cas où les anciens bat celui-ci.

+0

cela va comparer les lignes par référence, pas basé sur les valeurs de champ –

+0

@ vc74 Vous avez raison, j'ai mentionné le remplacement, mais n'a même pas remarqué que c'était un cas où il doit être utilisé, oups. –

+0

Pas de soucis, d'ailleurs, vouliez-vous dire dt.ROWS.Distinct (DataRowComparer.Default)? –

7

Vous devez utiliser DataRowComparer

IEnumerable<DataRow> distinctRows = 
    dt.AsEnumerable().Distinct(DataRowComparer.Default); 

Plus d'informations sur la comparaison des lignes de données à l'aide de LINQ ensemble de données peut être trouvé here