我有一个可以生成查询并将其导出到 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";
}
Run Code Online (Sandbox Code Playgroud)
如果我必须像这样手动完成它,那就有点混乱了。
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...
Run Code Online (Sandbox Code Playgroud)
PS:我真的很感谢您的启发,也感谢您的宝贵时间。
这是来自此 OP LINQ 的重复问题:动态选择
\n\n基于这些答案。
\n\npublic static Func<T, T> SelectorFunc<T>(string[] columns)\n{\n\n // input parameter "o"\n var xParameter = Expression.Parameter(typeof(T), "o");\n\n // new statement "new Data()"\n var xNew = Expression.New(typeof(T));\n\n // create initializers\n var bindings = columns.Select(o => o.Trim())\n .Select(o =>\n {\n\n // property "Field1"\n var mi = typeof(T).GetProperty(o);\n\n // original value "o.Field1"\n var xOriginal = Expression.Property(xParameter, mi);\n\n // set value "Field1 = o.Field1"\n return Expression.Bind(mi, xOriginal);\n }\n );\n\n // initialization "new Data { Field1 = o.Field1, Field2 = o.Field2 }"\n var xInit = Expression.MemberInit(xNew, bindings);\n\n // expression "o => new Data { Field1 = o.Field1, Field2 = o.Field2 }"\n var lambda = Expression.Lambda<Func<T, T>>(xInit, xParameter);\n\n // compile to Func<Data, Data>\n return lambda.Compile();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n并且消耗该函数将是_dbcontext.Person.SomeOtherQuery().Select( SelectorFunc<Person>(columns) ).ToList()
谢谢@T\xe1\xba\xa5n Nguy\xc3\xaan 的回答。
\n