c# - 动态 LINQ - 与 GROUP BY/SELECT 语法作斗争

标签 c# linq

我有一组重复的数据,我正在从多个 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/

相关文章:

c# - Borland C++ Builder 上是否有任何 "type",例如 C# 中的 "decimal"?

c# - 如果在高值范围而不是低值范围内计算, float 是否具有更高的精度?

c# - 使用 LINQ to Objects 语句的 "a lot"是否有一些缺点?

c# - 如何更改 Dictionary<string, bool> 中的所有值?

sql - 使用 LINQ 动态改变 'where' 语句中的条件数

c# - LINQ - 帮我举个例子,我觉得 LINQ 应该可以解决!

c# - 递归搜索类别及其子类别

c# - 在 C# 中使用文件的 TransactionScope

c# - 可空引用类型和选项模式

c# - 使用 C#/Linq 累积序列的子序列