c# - 如何使用动态 linq 核心根据另一个字段的条件进行选择和计数
问题描述
我正在使用Entity Framework和Dynamic 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 核心,因为在我的实际应用程序中,性别和年龄字段由用户决定,因此他们的字段名称将在运行时更改。
你会怎么做?
解决方案
假设您的查询返回以下类的对象列表
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"}]
推荐阅读
- ios - Swift 无效的重新声明类默认初始化
- angularjs - 有没有办法代理配置托管在角度 11 中不同域上的多个 api
- python - [python]Colab 在训练 gan(pytorch) 时因未知原因崩溃
- append - 如何附加具有相同变量名但不同数值的数据集?
- python - cUrl 到 python 转换 Clarifai
- react-native - 如何在当前的 react-native 项目中降级我的反应导航?
- python - Anaconda:如何判断我是否选中了“将 Anaconda3 添加到我的 PATH 环境变量”框?
- pgadmin-4 - pgadmin 4 返回“没有可用的密码或公钥!”是什么意思?
- java - 为多读设置 HttpServletRequest 有什么缺点吗?
- javascript - 从剪贴板复制并粘贴富文本到 mailto 正文