【问题标题】:Linq query - dynamic data typesLinq 查询 - 动态数据类型
【发布时间】:2016-03-24 17:10:31
【问题描述】:

我有一个 linq 查询可以很好地聚合来自 DataTable 的值。

这个想法是用户可以选择一个字段列表,然后 linq 根据所选字段聚合数据。

p_measure 是一个字符串变量,表示所选字段的名称。

但是,在当前的形式中,这一切都只适用于源表中所选字段的数据类型为“float”的情况。 如果用户选择一个'int' ...然后我会抛出一个强制转换异常。

所以问题是,我如何使这段代码“动态”来处理不同的数据类型?

// Table for receiving aggregated results 
var table = new DataTable();
table.Columns.Add(p_dimension, typeof(String));
table.Columns.Add(p_measure, typeof(Double));

// Query to perform aggregation
DataTable query = (from r in rootDT.AsEnumerable()
                   group r by new
                           {
                              Dimension = r.Field<string>(p_dimension)
                           } into g
                             select new
                           {
                              Dimension = g.Key.Dimension,
                              Measure = g.Sum(x => x.Field<double>(p_measure))
                            }
                         ).Aggregate(table, (dt, r) => dt.Rows.Add(r.Dimension,r.Measure); return dt; });

我可以处理“new DataTable”声明(第 4 行)中的类型:

table.Columns.Add(p_measure, typeof(Double));

通过生成和设置类型类型的变量,因此:

table.Columns.Add(p_measure, myTypeVariable);

但我不知道如何处理这个:

x.Field<double>(p_measure)

有什么想法吗??

【问题讨论】:

  • 你试过x.Field&lt;dynamic&gt;
  • 您是在对数据库执行此操作吗?如果是,那么您是否知道您正在将整个表拉入内存并在内存中进行所有查询?
  • 这是一个已经在内存中的数据表。只是用户想要查看 dataGridView 中的所有记录,以及旁边表示分组总计的图表。我知道,如果它是一个大型记录集,我应该考虑在数据库中进行繁重的工作。

标签: c# linq


【解决方案1】:

如果您希望结果始终为double,您可以使用

Measure = g.Sum(x => Convert.ToDouble(x[p_measure]))

那么它只会作用于任何数值类型,或者其值都可以解析为double的字符串列。

【讨论】:

  • 太棒了!!谢谢你。只是第一次开始使用 Linq,并认为它应该让我更加困惑。出于某种原因,我认为标准转换在查询中不起作用 - 现在踢自己!
  • @user3379697 很高兴它有效。需要明确的是 - 这不是“演员”。这是一个“转换”。转换将一种类型转换为另一种类型;强制转换只是改变绑定方法调用时变量的处理方式。您不能将 int“转换”为 double,因为它们不是兼容的数据类型 - 底层内存不同。
猜你喜欢
  • 2013-08-07
  • 2013-01-28
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
  • 2016-10-16
  • 2011-06-13
  • 1970-01-01
相关资源
最近更新 更多