2009-09-29 9 views
11

J'ai une table de données et je veux effectuer un groupe insensible à la casse par plus d'une colonne de table de données (par exemple Column1 de type chaîne). J'ai observé que normalement LINQ to DataSet effectue une comparaison sensible à la casse. Par exemple, si Column1 a deux valeurs de chaîne "Test" et "test", après avoir appliqué group by, il retourne deux lignes séparées avec les valeurs "Test" et "test", au lieu de un.LINQ to DataSet groupe insensible à la casse par

La requête est:

var countGroupQuery = from table in dataTable.AsEnumerable() 
         group table by table.Field<string>(Column1) into groupedTable 
         select new 
         { 
          value = groupedTable.Key, 
          count = groupedTable.Count() 
         }; 

est-il une méthode pour effectuer une insensible à la casse group by de telle sorte que dans l'exemple ci-dessus, je ne reçois que d'une ligne avec une valeur (soit « Test » ou « test ») ? ToUpper ou ToLower aurait fait modifier les valeurs majuscules ou minuscules supérieur au lieu d'utiliser au moins l'une des valeurs d'entrée, donc je ne veux pas utiliser ceci:

group table by table.Field<string>(Column1).ToUpper() into groupedTable 
+1

Vos modifications récentes sont [inappropriés] (http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from-posts) et, compte tenu de l'âge des posts auxquels vous les appliquez, spam probable. S'il vous plaît, renoncez. –

Répondre

22

Vous ne pouvez pas le faire à partir d'une expression de requête, mais vous pouvez le faire avec la notation dot:

var query = dataTable.AsEnumerable() 
        .GroupBy(x => table.Field<string>(Column1), 
           StringComparer.InvariantCultureIgnoreCase) 
        .Select(groupedTable => new 
          { 
           value = groupedTable.Key, 
           count = groupedTable.Count() 
          }); 

Vous pouvez même utiliser une surcharge plus compliquée de GroupBy de le faire en un seul appel: Il est évident que cela utilise la culture invariante - vous pouvez également utiliser la culture actuelle ou les règles ordinales.

+1

Merci pour la réponse. c'est ce que je cherche !!! Par ailleurs, si je veux appliquer un groupe sur plus d'une colonne (Colonne1 et Colonne2), alors comment devrait ressembler cette requête ?? – Anoop

+0

@Anoop: Le regroupement de plusieurs colonnes * et * de manière insensible à la casse sera délicat. Il est probablement préférable de créer un type personnalisé contenant les colonnes qui vous intéressent et de remplacer Equals. –

+0

Jon! Pouvez-vous s'il vous plaît l'expliquer d'une manière un peu plus détaillée? – Anoop

3

Cette MSDN article contient des informations sur des jeux de données et sensibilité à la casse ..

Vous pouvez contrôler la sensibilité à la casse de filtrage, la recherche et le tri en mettant CaseSensitive la propriété de l'ensemble de données.

+0

Dans mon cas, DataTable est indépendant de Dataset, la propriété sensible à la casse est donc définie sur false. Je pense que Linq ne se réfère pas à cette propriété. C'est pour les opérations exposées par la classe Dataset/Datatable. – Anoop

+0

DataTable a également la propriété. Mais honnêtement, je n'ai pas utilisé LINQ pour interagir avec les jeux de données/tableaux, donc je ne peux pas dire si cela aurait réellement un effet. –

+0

Cela ne fonctionne pas pour moi. Avez-vous essayé avec LINQ? – Bryan

0
var query = dt.AsEnumerable() 
       .GroupBy(r => r.Field<string>("Mes")) 
       .Select(g => new { Mes = g.Key, 
           Tns = g.Sum(s => Convert.ToDecimal(s.Field<string>("Tns"))) }) 
       .OrderBy(g => g.Mes.First()) 
       .Where(g => g.Mes == ddlMes.SelectedValue.ToString()); 
Questions connexes