c# - 动态 Linq 从列表中选择>
问题描述
考虑我有这个IQueryble
类似于这个列表 List 和 linq 的数据库集合:
var lstData = new List<IDictionary<string, object>>()
{
new Dictionary<string, object>() {
{ "Name" , "John"},
{ "Age", 20 },
{ "School", "Waterloo" }
},
new Dictionary<string, object>() {
{ "Name" , "Goli"},
{ "Age", 23 },
{ "School", "Mazandaran" }
},
};
var result = lstData.Select(x => new { Name= x["Name"], School= x["School"] });
但是,我不知道编译时的属性名称。如何在运行时动态选择 Linq 选择中的特定列?像这样的东西:
var result= lstData .Select("Name,School");
解决方案
我已经完成了代码,试试下面的代码。
Func<IDictionary<string, object>, dynamic> CreateDynamicFromDict(string fields)
{
// input parameter "x"
var xParameter = Expression.Parameter(typeof(IDictionary<string, object>), "x");
// output object
var result = Expression.Parameter(typeof(IDictionary<string, object>), "result");
var add = typeof(IDictionary<string, object>).GetMethod("Add");
var body = new List<Expression>();
//initial output object
body.Add(Expression.Assign(result, Expression.New(typeof(ExpandoObject))));
// set value "FieldN = x.FieldN"
var bindings = fields.Split(',').Select(o => o.Trim())
.Select(o =>
{
var key = Expression.Constant(o);
return Expression.Call(result, add, key, Expression.Property(xParameter, "Item", key));
});
body.AddRange(bindings);
// return value
body.Add(result);
var block = Expression.Block(new[] { result }, body);
var lambda = Expression.Lambda<Func<IDictionary<string, object>, dynamic>>(block, xParameter);
// compile to Func<IDictionary<string, object>, dynamic>
return lambda.Compile();
}
用法是
var result = lstData.Select(CreateDynamicFromDict("Field1, Field2"));
参考:
推荐阅读
- bash - 行尾多余的“-”
- python - 在 Python 中使用 NewApi 中的多个条件
- regex - 从头开始匹配文件名和版本
- java - 如何在字符串后添加到println中的数字
- javascript - 如何使用 Jest 查看格式化的“收到”结果?
- plugins - 为什么 gatsby-plugin-google-gtag 包含 analytics.js 和 gtag.js?
- asp.net-mvc - IIS 应用程序池登录凭据停止 .net Core
- spring-data-jpa - 如何在不使用 Tomcat JDBC 的情况下为基于 Hikari 的项目设置 AWS X-Ray SQL Instrumentation?
- jquery - Draggable Div 只能拖动一次
- python - Python中的双向通信Socket