2009-07-01 6 views
2

J'ai un datatable commeTri & Unique Records dans LINQ

public DataTable functiongettable() 
{ 
     DataTable dt = new DataTable(); 

     dt.Columns.Add("Name"); 
     dt.Rows.Add("Name1"); 
     dt.Rows.Add("Name5"); 
     dt.Rows.Add("Name6"); 
     dt.Rows.Add("Name3"); 
     dt.Rows.Add("Name3"); 
     dt.Rows.Add("Name6"); 
     dt.Rows.Add("Name3"); 
     dt.Rows.Add("Name5"); 
     dt.Rows.Add("Name5"); 

     return dt; 
} 

En utilisant la requête LINQ Je veux effectuer un tri et besoin d'enregistrements uniques.

que je fais comme ça

var query = from c in functiongettable().AsEnumerable().OrderBy("Name").Distinct() select c; 

Mais obtenir l'erreur:

Les arguments de type pour la méthode « System.Linq.Enumerable.OrderBy (System.Collections.Generic.IEnumerable, System.Func) 'ne peut être déduit de l'utilisation. Essayez de spécifier explicitement les arguments de type.

Comment résoudre ce problème?

Merci à l'avance

Répondre

2

Essayez spécifiant le DataRowComparer.Default dans le Distinct déclaration.

MISE À JOUR:

Et utiliser row.Field ("Name") lors du tri

MISE A JOUR nouveau:

var query = (from c in functiongettable().AsEnumerable() 
      orderby c.Field<string>("Name") 
      select c).Distinc(DataRowComparer.Default); 
1

Vous devez passer un délégué à OrderBy, non un string.

Essayez ceci:

 var query = dt.AsEnumerable() 
      .OrderBy(dr => dr.ItemArray[0] as string) 
      .Distinct(DataRowComparer.Default).Select(dr => dr.ItemArray[0]); 

     foreach (var item in query) 
     { 
      Console.WriteLine(item); 
     } 
1

Vous ne pouvez pas passer chaîne comme paramètre dans OrderBy(). Vous devez passer dans la fonction d'identité comme ceci:

functiongettable().AsEnumerable().OrderBy(x=>x.Field<string>("Name")).Distinct() 

Et je ne pense pas que vous obtiendrez des résultats distincts ici, comme la méthode Distinct() utilisera l'opérateur d'égalité par défaut du TSource, qui, dans ce le cas sera du DataRow. Il ne sélectionnera pas distinctement en fonction de la valeur string de votre colonne Name.

Questions connexes