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