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