LINQ to DataSet без учета регистра

У меня есть таблица данных, и я хочу выполнить группу, не чувствительную к регистру, над столбцом таблицы данных (скажем Column1 строки типа). Я заметил, что обычно LINQ to DataSet выполняет сравнение, чувствительное к регистру. Например, если Column1 имеет два строковых значения "Test" и "test", после применения group by он возвращает две отдельные строки со значениями "Test" и "test" вместо одного.

Запрос:

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

Есть ли какой-либо метод для выполнения нечувствительности к регистру group by, так что в приведенном выше примере я получаю только одну строку с одним значением (либо "Тест", либо "тест" )? ToUpper или ToLower фактически изменит значения в верхнем или нижнем регистре вместо использования хотя бы одного из входных значений, поэтому я не хочу использовать это:

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

Ответ 1

Вы не можете сделать это из выражения запроса, но вы можете сделать это с помощью точечной нотации:

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

Вы можете даже использовать более сложную перегрузку GroupBy, чтобы сделать это за один вызов:

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

Очевидно, что с использованием инвариантной культуры вы также можете использовать текущую культуру или порядковые правила.

Ответ 2

Эта статья статья MSDN содержит некоторую информацию о наборах данных и чувствительности к регистру.

Вы можете контролировать чувствительность к регистру фильтрации, поиска и сортировки путем установки набора данных CaseSensitiveсвойство.

Ответ 3

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