【问题标题】:Linq to DataTable (GROUP BY) when columns are not known当列未知时,Linq to DataTable (GROUP BY)
【发布时间】:2023-03-20 23:35:01
【问题描述】:

我需要使用 LINQ 针对数据表创建动态报告。在用户指定给定的复杂查询之前,数据表的内容是未知的。如果字段已知,则以下 LINQ 查询将起作用:

var groups = results.AsEnumerable();

var groupList = from g in groups
              group g by g.Field<string>(column) into Grup
                    select new { 
                          GroupedBy = Grup.Key, 
                          CountValue = Grup.Count(r=>r.Field)<int>(countColumn))
                     };

但是,由于我不知道字段类型,当列是整数类型(或不同于字符串)时,代码将失败:

              group g by g.Field<string>(column) into Grup

因为它不能将 int 转换为 string。错误如下:

无法将“System.Int32”类型的对象转换为“System.String”类型

关于如何解决此问题的任何建议?我试图使用以下方法确定列的数据类型:

results.Columns[column].DataType

然后使用数据类型进行转换,但这显然不起作用。类似的东西:

group g by g.Field<results.Columns[column].DataType>(column) into Grup

【问题讨论】:

标签: c# linq casting datatable


【解决方案1】:

你能不能避免使用扩展方法而改用Item

喜欢:

var groups = results.AsEnumerable();

var groupList = from g in groups
          group g by g.Item[column] into Grup
                select new { 
                      GroupedBy = Grupi.Key, 
                      CountValue = Grupi.Countr=>r.Field<int>(countColumn))
                 };

当然,您会招致装箱/拆箱,但考虑到您处理动态输出的方式,我认为这与领域有关。

【讨论】:

  • 我正在尝试这种方法,但我得到以下信息:“'System.Data.DataRow' 不包含 'Item' 的定义,并且没有扩展方法 'Item' 接受类型的第一个参数' System.Data.DataRow' 可以找到"
  • 我猜是缺少了敬意!?
  • 是的,也许。这是 msdn 参考:msdn.microsoft.com/en-us/library/…。不过,奇怪的是,如果您使用数据集扩展,您应该使用 System.Data。确保您有 System.Data 的 using 子句...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-31
  • 2023-04-08
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
相关资源
最近更新 更多