2012-02-16 3 views
0

J'ai un tableau de chaînes dites:Linq Groupe de requête par plusieurs colonnes

String[] Fields=new String[]{RowField,RowField1} 

dans lequel je peux utiliser la requête ci-dessous pour obtenir les valeurs en spécifiant les valeurs est question à savoir RowField et RowField1:

var Result = (
from x in _dataTable.AsEnumerable() 
select new 
{ 
    Name = x.Field<object>(RowField), 
    Name1 = x.Field<object>(RowField1) 
}) 
.Distinct(); 

Mais si je suppose beaucoup de valeurs dans le tableau comme:

String[] Fields= new String[] 
{ 
    RowField, 
    RowField1, 
    RowField2, 
    ....... 
    RowField1000 
}; 

Comment puis-je utiliser la requête ici withou t spécifier chacun des rowfield dans la requête? Comment puis-je parcourir les éléments du tableau à l'intérieur du LINQ?

Selon certaines suggestions dans LINQ query and Array of string J'essaie d'obtenir le résultat en utilisant le code ci-dessous.

var result = (from row in _dataTable.AsEnumerable() 
       let projection = from fieldName in fields 
         select new {Name = fieldName, Value = row[fieldName]} 
       select projection.ToDictionary(p=>p.Name,p=>p.Value)) 
      .Distinct(); 

Mais le problème est qu'il ne renvoie pas les valeurs distinctes.Toutes les idées?

Répondre

0

Commencez par DataRows distinct en utilisant this overload of Distinct():

_dataTable.AsEnumerable().Distinct(new DataRowEqualityComparer()) 

DataRowEqualityComparer est:

public class DataRowEqualityComparer : IEqualityComparer<DataRow> 
{ 
    public bool Equals(DataRow x, DataRow y) 
    { 
     return x.ItemArray.SequenceEqual(y.ItemArray); 
    } 

    public int GetHashCode(DataRow obj) 
    { 
     return string.Join("", obj.ItemArray).GetHashCode(); 
    } 
}