【发布时间】: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<dynamic> -
您是在对数据库执行此操作吗?如果是,那么您是否知道您正在将整个表拉入内存并在内存中进行所有查询?
-
这是一个已经在内存中的数据表。只是用户想要查看 dataGridView 中的所有记录,以及旁边表示分组总计的图表。我知道,如果它是一个大型记录集,我应该考虑在数据库中进行繁重的工作。