我有一个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)
任何想法??
答案 0 :(得分:1)
如果您希望结果始终为double
,则可以使用
Measure = g.Sum(x => Convert.ToDouble(x[p_measure]))
然后它只会在任何数值类型或字符串列上,其值都可以解析为double
。