C# LINQ:动态创建属性和值,其中包括来自分组查询的值的总和

3

我的标题有点令人困惑,所以我会在这里解释一下。

以下是我的示例查询及我希望实现的内容:

var results = from row in toSearch.AsEnumerable()
              group by row.Field<String>("Somename") into grp
              select new
                        {
                         GroupMe = grp.Key,

                         foreach (var k in someDic.Keys){
                               TODOPROPERTYNAMEFROMk = grp.sum(x => grp.k);
                         }
                          };

这是我想要实现的一般想法。基于键字典,我想创建属性名称,并在分组查询中汇总数据。总和将基于键的值。
toSearch是一个datatable,字典的所有键构成了datatable的一些标题。对我来说,这似乎是不可能的,我已经查阅了一些来源,其中之一(对不起,我忘记了作者......)给了我这个解决方案:
//For generating dynamic objects fr
  public static object DynamicProjection(object input, IEnumerable<string> properties)
{
    var type = input.GetType();
    dynamic dObject = new System.Dynamic.ExpandoObject();
    var dDict = dObject as IDictionary<string, object>;

    foreach (var p in properties)
    {
        var field = type.GetField(p);
        if (field != null)
            dDict[p] = field.GetValue(input);

        var prop = type.GetProperty(p);
        if (prop != null && prop.GetIndexParameters().Length == 0)
            dDict[p] = prop.GetValue(input, null);
    }

    return dObject;
}

我曾试图像这样使用它。
var results = from row in toSearch.AsEnumerable()
          group by row.Field<String>("Somename") into grp
          select grp;
var test = results.Select( x => DynamicProjection(x,someDic.Keys));

这让我得到了一个无法利用的对象,或者至少不能调用其属性。我真的很希望能在实现原始目标方面获得任何帮助,对于这篇长文我感到抱歉。 编辑 预期的输入是数据表格,例如:
Fee | Fi | Fo | Fum
cat | ds | 2  | 93
cow | ff | 5  | 120
cat | ds | 9  | 33
cow | jk | 1  | 133

按标题分组: 费用
已接收的标题:Fo,Fum
预期输出:

cat | 11  | 126
cow | 6   | 253

获胜者:奶牛,所以领养一只奶牛*只是开个玩笑哈。

你能展示一下输入和(期望的)输出格式吗? - Hari Prasad
@HariPrasad 已更新 :) 感谢您抽出时间阅读此内容。 - user1423316
所以基于收到的标题,您想要对这些列求和? - Hari Prasad
1个回答

0

我对ExpandoObject并不是很熟悉(我的说法可能有误),你可以使用Dictionary<columnname, sum>

我建议返回一个包含标题和相应总数的Dictionary

// ex -- Given following header
List<string> headers = new List<string>();
headers.Add("fo");
headers.Add("fum");    

DataTable dt; // Assign correct data source.
var results =dt.AsEnumerable()
        .GroupBy(g=>g.Field<string>("fee"))       
        .Select(x=> new 
                {
                    x.Key, 
                    dict = headers.ToDictionary(h=>h, h=>x.Sum(s=>s.Field<int>(h)))
                })
        .ToList();  

这个查询按照 fee 列进行分组,并计算给定标题列的总和。

查看此 Demo

输出:

Key=cat, column fo , Sum 11, column fum , Sum 126
Key=cow, column fo , Sum 6, column fum , Sum 253

谢谢!这不允许我在选择语句中包含for循环,但它为我提供了一种替代方案。我会等待看看是否有人能够为我提供一个for循环的解决方案。否则我会break;并将您的答案标记为正确 :) 干杯! - user1423316
为什么你需要 for循环,它已经为你完成了工作。或者我错过了什么? - Hari Prasad
通过使用for循环,我可以在一个linq语句中执行复杂的查询。这个想法是允许我在for循环内部执行额外的要求,例如if语句或者嵌套的for循环。你的答案很好,但是我需要一个适合我的复杂度水平的答案。否则,我会像之前承诺的那样采用这个解决方案 :) - user1423316
不是很确定,但无论如何我会点赞以引起更多关注此问题 :-) - Hari Prasad
谢谢你的帮助,伙计 :) - user1423316

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接