Linq查询 - 动态数据类型

时间:2016-03-24 17:10:31

标签: c# linq

我有一个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));

通过生成&amp;设置Type类型的变量,因此:

table.Columns.Add(p_measure, myTypeVariable);

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

x.Field<double>(p_measure)

任何想法??

1 个答案:

答案 0 :(得分:1)

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

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

然后它只会在任何数值类型或字符串列上,其值都可以解析为double