首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >动态LINQ -通过/选择语法与组进行斗争

动态LINQ -通过/选择语法与组进行斗争
EN

Stack Overflow用户
提问于 2014-11-24 17:19:45
回答 1查看 1.7K关注 0票数 3

我有一个重复的数据集,我正在从多个SQL表(说来话长,但它们都有不同的名称,尽管有相同的数据)检索到一个.NET数据表:-

代码语言:javascript
复制
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对日期/时间字段中的数据进行分组,这样我最终得到的记录如下:

2014年11月24日16:18:07 -> 15.1 -> 16.1 -> 17.1

我的问题是,我不知道会有多少组数据(示例中有三个,但可能有任何数字),所以我需要使用动态LINQ。

对于固定数量字段的LINQ查询,我还好:-

代码语言:javascript
复制
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使它变得动态,下面给我一个错误:

代码语言:javascript
复制
        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‘”}

我只是不知道如何引用'Point_Value‘字段一旦我做了GroupBy -将有多个'sum(Point_ValueX)’字段取决于数据集的数量,但我甚至不能让它工作在一个字段!

非常感谢,

大卫。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-24 22:55:44

我不认为你能这样做。动态linq似乎无法解析包含索引器的表达式。

但是,您可以使用动态LINQ和常规LINQ的组合:

代码语言:javascript
复制
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结果转换为IEnumerable<IGrouping<DynamicClass,DataRow>>

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27110445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档