我有一组重复的数据,我正在从多个 SQL 表(说来话长,但尽管具有相同的数据,但它们都有不同的名称)检索到 .NET 数据表中:-
Point_Date -> Point_Value0 -> Point_Value1 -> Point_Value2 -> Point_ValueX
24/11/2014 16:18:07 -> 15.1 -> NULL -> NULL
24/11/2014 16:19:07 -> 15.2 -> NULL -> NULL
24/11/2014 16:20:07 -> 15.3 -> NULL -> NULL
24/11/2014 16:18:07 -> NULL -> 16.1 -> NULL
24/11/2014 16:19:07 -> NULL -> 16.2 -> NULL
24/11/2014 16:20:07 -> NULL -> 16.3 -> NULL
24/11/2014 16:18:07 -> NULL -> NULL -> 17.1
24/11/2014 16:19:07 -> NULL -> NULL -> 17.2
24/11/2014 16:20:07 -> NULL -> NULL -> 17.3
我想使用 LINQ 对日期/时间字段上的数据进行分组,以便最终得到如下记录:-
24/11/2014 16:18:07 -> 15.1 -> 16.1 -> 17.1
我的问题是我不知道会有多少组数据(示例中有三组,但可以是任意数量)所以我需要使用动态 LINQ。
我可以使用 LINQ 查询固定数量的字段:-
var dtReport = (from row in dtPoints.AsEnumerable()
group row by row.Field<DateTime>("Point_Date")
into t
select new
{
TempDate = t.Key,
Value1 = (double?) t.Sum(r => r.Field<double?>("Point_Value0") ?? 0),
Value2 = (double?)t.Sum(r => r.Field<double?>("Point_Value1") ?? 0),
Value3 = (double?)t.Sum(r => r.Field<double?>("Point_Value2") ?? 0)
});
但我在使用 System.Linq.Dynamic 使其动态化时遇到了真正的困难,以下给了我一个错误:-
var myRpt2 = dtPoints.AsEnumerable()
.AsQueryable()
.GroupBy("new ( it[\"Point_Date\"] as GrpByCol1)", "it")
.Select("new (it.key as TempDate, it.sum(\"Point_Value0\") as SumValue)");
- 错误是:-
System.Linq.Dynamic.ParseException {“不存在适用的聚合方法‘sum’”}
完成 GroupBy 后,我只是想不出如何引用“Point_Value”字段 - 将有多个“sum(Point_ValueX)”字段,具体取决于数据集的数量,但我可以目前甚至无法让它在单个字段中工作!
非常感谢,
大卫。
最佳答案
我不认为你可以那样做。似乎动态 linq 不具备解析包含索引器的表达式的能力。
但是,您可以结合使用动态 LINQ 和常规 LINQ:
var myRpt2 = (
dtPoints.AsEnumerable()
.AsQueryable()
.GroupBy("new ( it[\"Point_Date\"] as GrpByCol1)", "it")
as IEnumerable<IGrouping<DynamicClass,DataRow>>
)
.Select (r => new { ((dynamic)r.Key).GrpByCol1,
Sum = r.Sum(x => x.Field<decimal>("Point_Value0"))});
主要转折点是 GroupBy
的 Actor 阵容结果为 IEnumerable<IGrouping<DynamicClass,DataRow>>
.
关于c# - 动态 LINQ - 与 GROUP BY/SELECT 语法作斗争,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27110445/