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 так что в приведенном выше примере я получаю только одну строку с одним значением ("Test" или "test")? ToUpper или же ToLower фактически изменил бы значения на верхний или нижний регистр вместо использования хотя бы одного из входных значений, поэтому я не хочу использовать это:

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

3 ответа

Решение

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

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

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

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

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

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());
Другие вопросы по тегам