11
votes

LINQ to DataSet Case Insensible Group par

J'ai une table de données et je souhaite effectuer un groupe insensible à une affaire sur une colonne de table de données (dire colonne1 de type chaîne de type). J'ai observé que Normalement Linq to DataSet effectue une comparaison sensible à la casse. Par exemple, si colonne1 a deux valeurs de chaîne "test" et "test", après l'application groupe par il renvoie deux lignes distinctes avec les valeurs "Test" et "Test" , au lieu d'un.

La requête est la suivante: xxx

existe-t-il une méthode pour effectuer un groupe insensible à une casse-insensibilité par de sorte que dans le Au-dessus de l'exemple, je n'ai qu'une ligne avec une seule valeur (test "ou" test ")? TOUPPER ou tolower modifierait effectivement les valeurs en majuscules ou en minuscules au lieu d'utiliser au moins une des valeurs d'entrée, donc je ne veux pas utiliser ceci: xxx


1 commentaires

Vos modifications récentes sont inapproprié et , compte tenu de l'âge des postes que vous les appliquez, probablement spam. S'il vous plaît désister.


3 Réponses :


3
votes

Ce Article MSDN a des informations sur les jeux de données et la sensibilité des cas ..

Vous pouvez contrôler la sensibilité du boîtier de filtrage, de recherche et de tri En définissant le Casensitive propriété.


2 commentaires

Dans mon cas, DataTable est indépendant de DataSet afin que la propriété sensible à la casse soit définie sur FALSE. Je pense que Linq ne fait pas référence à cette propriété.Il est destiné aux opérations exposées par DataSet / DataTable Class.


DataTable a aussi la propriété. Mais honnêtement, je n'ai pas utilisé Linq pour interagir avec des jeux de données / des tables afin que je ne puisse donc pas dire si cela aurait effectivement un effet.



23
votes

Vous ne pouvez pas faire cela à partir d'une expression de requête, mais vous pouvez le faire avec la notation de points: xxx pré>

Vous pouvez même utiliser une surcharge plus compliquée de groupby code > Pour le faire dans un appel: P>

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


4 commentaires

Merci d'avoir répondu. C'est ce que je cherche !!! Au fait, si je veux appliquer un groupe par plus d'une colonne (colonne1 et colonne2), alors comment cette requête devrait-elle ressembler ??


@Anoop: le regroupement par plus d'une colonne et le faisant de manière insensible au cas sera délicat. Vous seriez probablement préférable à construire un type personnalisé contenant les colonnes qui vous intéressent et remplacent les égaux.


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


J'ai bien peur de ne pas avoir le temps pour le moment. Je vais essayer de revenir plus tard.



0
votes
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());

0 commentaires