LINQ to DataSet不区分大小写的分组

12

我有一个数据表,想在数据表的一列(比如类型为字符串的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")的行?ToUpperToLower 实际上会将值更改为大写或小写,而不是使用至少一个输入值,所以我不想使用它们:

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

1
你最近的编辑是不恰当的,而且考虑到你应用它们的帖子的年龄,很可能是垃圾信息。请停止这样做。 - Michael Petrotta
3个回答

23

你无法使用查询表达式完成此操作,但可以使用点符号表示法:

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
谢谢你的回答。这正是我在寻找的!!!顺便问一下,如果我想对多个列(Column1和Column2)应用分组,那么查询应该是什么样子的? - Anoop
@Anoop:按多个列进行分组,并以不区分大小写的方式进行分组将会很棘手。你最好建立一个包含你感兴趣的列的自定义类型,并覆盖Equals方法。 - Jon Skeet
Jon!你能否详细地解释一下吗? - Anoop
很抱歉,我现在没有时间。我会尽量晚些时候回来处理这个问题。 - Jon Skeet

3

这篇MSDN文章提供了关于数据集和大小写敏感性的一些信息。

您可以通过设置数据集的CaseSensitive属性来控制过滤、搜索和排序的大小写敏感性。


在我的情况下,DataTable 是独立于 Dataset 的,因此大小写敏感属性被设置为 false。我认为 Linq 不会引用这个属性。它是针对 Dataset/Datatable 类公开的操作。 - Anoop
DataTable也有这个属性。但是说实话,我还没有使用LINQ与数据集/表进行交互,所以我不能确定它是否会产生影响。 - Quintin Robinson

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接