首页 > 解决方案 > 如何使用动态 linq 核心根据另一个字段的条件进行选择和计数

问题描述

我正在使用Entity FrameworkDynamic Linq Core在运行时执行一些动态查询。我有一个关于如何编写动态 linq 语句来输出计数列的问题,其中每列是另一个字段的字段项。

假设我有一个包含 3 列的表:ID、性别和年龄(假设它们只有 10 多岁)。

ID | Gender | Age
01 |   male |  20
02 | female |  30
... some thousands of rows

我想按年龄组计算每种性别(groupBy Gender)的人数。

[{Gender:"male", "20": 120, "30": 200, "40": 300},
{Gender:"female", "20": 300, "30": 200, "40": 1000 }]

我尝试按年龄分组,但这并不能完全按照上述格式给出我想要的内容,因为每个性别和年龄组合都会成为一个新的数组项。

var query = db.someDB
        .GroupBy("new(Gender, Age)")
        .Select("new(Key.Gender as Gender, Key.Age as Age, Count() as value)");

我被限制使用动态 linq 核心,因为在我的实际应用程序中,性别和年龄字段由用户决定,因此他们的字段名称将在运行时更改。

你会怎么做?

标签: c#entity-frameworklinqdynamic-linq

解决方案


假设您的查询返回以下类的对象列表

public class Data {
 public string Gender { get; set;}
 public int Age { get; set;}
 public int Value { get; set;}
}
  Data results = //query result

  var resultsV2 = results.GroupBy(r => r.Gender);
      
  var list = new List<IDictionary<string, object>>();

  foreach(var g in resultsV2)
  {
    IDictionary<string, object> obj = new ExpandoObject();

    var data = g.Select(x => x);
    obj["Gender"] = $"{g.Key}";
        
    foreach(var d in data)
    {
      var propName = $"{d.Age}";
      obj[propName] = $"{d.Value}";
    }

    list.Add(obj);

  }

  string jsonString = JsonConvert.SerializeObject(list);

提琴手

输入:

new List<Data>
{
  new Data() { Gender = "Male", Age = 20, Value = 5 },
  new Data() { Gender = "Male", Age = 30, Value = 3 },
  new Data() { Gender = "Female", Age = 20, Value = 9 }
};

输出:

[{"Gender":"Male","20":"5","30":"3"},{"Gender":"Female","20":"9"}]

推荐阅读