2009-09-29 7 views
11

Mam tabelę danych i chcę wykonać grupę niewrażliwą na wielkość liter przez kolumnę tabeli danych (na przykład Column1 ciągu znaków typu). Zauważyłem, że zwykle LINQ do DataSet wykonuje porównanie wielkości liter. Na przykład, jeśli Column1 ma dwie wartości ciągu "Test" i "test", po zastosowaniu group by zwraca dwa osobne wiersze z wartościami "Test" i "test", zamiast jednego.LINQ do grupy niewrażliwych na wielkość liter DataSet:

Zapytanie jest:

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

jest jakiś sposób, aby wykonać przypadku niewrażliwe group by tak, że w powyższym przykładzie I uzyskać tylko jeden rząd z jednej wartości (albo „test” i „Test”), ? ToUpper lub ToLower faktycznie zmienić wartości albo wielkimi literami lub małymi literami, a nie przy użyciu co najmniej jedną z wartości wejściowych, więc nie chcę użyć to:

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

Ostatnie zmiany są [nieodpowiednie] (http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from-posts) oraz, ze względu na wiek postów, do których je stosujesz, prawdopodobnie spam. Proszę zaniechać. –

Odpowiedz

22

Nie można tego zrobić z wyrażeniu kwerendy, ale można to zrobić z kropką notacji:

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

Można nawet użyć bardziej skomplikowanej przeciążenie GroupBy to zrobić w jednej rozmowy:

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

Oczywiście wykorzystuje to kulturę niezmienniczą - można również użyć aktualnej kultury lub reguł porządkowych.

+1

Niż za odpowiedź. tego właśnie szukam !!! Nawiasem mówiąc, jeśli chcę zastosować grupę przez więcej niż jedną kolumnę (Column1 i Column2), to jak powinno wyglądać to zapytanie? – Anoop

+0

@Anoop: Grupowanie według więcej niż jednej kolumny * i * czynienie tego w sposób niewrażliwy na wielkość liter będzie trudne. Najprawdopodobniej najlepiej byłoby zbudować niestandardowy typ zawierający kolumny, które są zainteresowane, i przesłonić równe. –

+0

Jon! Czy możesz wyjaśnić to nieco bardziej szczegółowo? – Anoop

3

Ten MSDN article ma jakieś informacje na temat zbiorów danych i sprawa wrażliwość ..

można kontrolować wielkość liter filtrowania, wyszukiwania i sortowania poprzez ustawienie danej jednostki CaseSensitive nieruchomości.

+0

W moim przypadku DataTable jest niezależna od zestawu danych, więc właściwość rozróżniana wielkich i małych liter ma wartość false. Myślę, że Linq nie odnosi się do tej właściwości. Jest to związane z operacjami wyeksponowanymi przez klasę Dataset/DataCable. – Anoop

+0

DataTable również ma właściwość. Ale szczerze mówiąc, nie użyłem LINQ do interakcji z zestawami danych/tabelami, więc nie mogę powiedzieć, czy to faktycznie miałoby wpływ. –

+0

To nie działa dla mnie. Czy próbowałeś tego z 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()); 
Powiązane problemy