c# - LINQ 根据字符串数组选择列 []
问题描述
我有一个可以生成查询并将其导出到 excel 的方法。我希望用户选择他们希望在哪些列上导出。
我的问题有点类似于这个 OP LINQ select property by name
我们可以在其中创建一个基于列表的LINQ 选择查询string[] columns
,它应该类似于下面的这个_dbcontext.Person.Select( SelectorFunc(columns) ).SomeOtherQuery().ToList();
查询和函数SelectorFunc(columns)
public Func<Person, string[]> SelectorFunc(string[] columns) {
// ninja code!!
return " not sure here";
}
如果我不得不像手动操作一样,它有点乱。
var query = _dbcontext.Person.AsQueryable();
if(column == "ID")
query = query.Select( x=x.ID);
if(column == "Name")
query = query.Select( x=x.Name);
//and the list goes on...
PS:我非常感谢您的启发,感谢您的宝贵时间。
解决方案
这是来自此 OP LINQ 的重复问题:动态选择
基于这些答案。
public static Func<T, T> SelectorFunc<T>(string[] columns)
{
// input parameter "o"
var xParameter = Expression.Parameter(typeof(T), "o");
// new statement "new Data()"
var xNew = Expression.New(typeof(T));
// create initializers
var bindings = columns.Select(o => o.Trim())
.Select(o =>
{
// property "Field1"
var mi = typeof(T).GetProperty(o);
// original value "o.Field1"
var xOriginal = Expression.Property(xParameter, mi);
// set value "Field1 = o.Field1"
return Expression.Bind(mi, xOriginal);
}
);
// initialization "new Data { Field1 = o.Field1, Field2 = o.Field2 }"
var xInit = Expression.MemberInit(xNew, bindings);
// expression "o => new Data { Field1 = o.Field1, Field2 = o.Field2 }"
var lambda = Expression.Lambda<Func<T, T>>(xInit, xParameter);
// compile to Func<Data, Data>
return lambda.Compile();
}
并且使用该功能将是_dbcontext.Person.SomeOtherQuery().Select( SelectorFunc<Person>(columns) ).ToList()
谢谢@Tấn Nguyên 的回答。
推荐阅读
- javascript - 如何在 NX 项目中使用 es6 将 jest 与 node_modules 一起使用
- android - 尝试导入定义“value”的库,将名称更正为现有 setter 的名称,或定义名为“value”的 setter 或字段
- highcharts - 折叠 Highcharts 组织结构图
- amazon-web-services - 如何使用 boto3 同步 AWS S3 存储桶和本地文件夹
- amazon-dynamodb - 使用 Pynamodb 保存对象创建日期时间
- angular - 子角度应用程序,在主要角度应用程序内,在子路由处
- r - R:替换
在因子变量中为 0 - windows - 如何避免在 CMD 中将字符串解释为命令?
- typescript - 如何使树函数通用?
- java - 不推荐使用 Spring 和 mongodb AggregationOutput