【问题标题】:LINQ to DataSet case insensitive group byLINQ to DataSet 不区分大小写分组方式
【发布时间】:2010-12-02 05:40:47
【问题描述】:

我有一个数据表,我想通过数据表的一列(比如字符串类型的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,以便在上面的示例中我只得到一个具有一个值的行(“测试”或“测试”)? ToUpperToLower 实际上会将值更改为大写或小写,而不是使用至少一个输入值,所以我不想使用这个:

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

【问题讨论】:

  • 您最近的编辑是inappropriate,考虑到您应用它们的帖子的年龄,很可能是垃圾邮件。请停止。

标签: linq datatable dataset group-by case-insensitive


【解决方案1】:
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());

【讨论】:

    【解决方案2】:

    你不能从查询表达式中做到这一点,但你可以用点表示法做到这一点:

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

    显然这是使用不变的文化 - 您也可以使用当前的文化或序数规则。

    【讨论】:

    • 感谢您的回答。这就是我要找的!!!顺便说一句,如果我想在多个列(Column1 和 Column2)上应用分组依据,那么这个查询应该是什么样子??
    • @Anoop:按多个列分组并且以不区分大小写的方式这样做会很棘手。您可能最好构建一个包含您感兴趣的列的自定义类型,并覆盖 Equals。
    • 乔恩!能不能说的详细一点??
    • 恐怕我现在没有时间。我稍后会尝试回到这个问题。
    【解决方案3】:

    这个MSDN article 有一些关于数据集和区分大小写的信息..

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

    【讨论】:

    • 在我的情况下,DataTable 独立于 Dataset,因此区分大小写的属性设置为 false。我认为 Linq 没有引用这个属性。它是用于 Dataset/Datatable 类公开的操作。
    • DataTable 也有这个属性。但老实说,我没有使用 LINQ 与数据集/表进行交互,所以我不能说它是否真的会产生影响。
    猜你喜欢
    • 2011-04-20
    • 2017-03-07
    • 2010-10-16
    • 1970-01-01
    • 2023-04-01
    • 2021-07-05
    • 2015-06-19
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多