我有一个数据表,我希望通过一列数据表(比如string类型的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
答案 0 :(得分:22)
您不能从查询表达式执行此操作,但可以使用点表示法执行此操作:
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));
显然,这是使用不变文化 - 你也可以使用当前的文化或序数规则。
答案 1 :(得分:3)
此MSDN article包含有关数据集和区分大小写的一些信息。
您可以控制区分大小写 过滤,搜索和排序 通过设置数据集的CaseSensitive 属性。
答案 2 :(得分: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());