LINQ 根据 string[] 数组选择列

Jul*_*son 3 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";
}
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:我真的很感谢您的启发,也感谢您的宝贵时间。

Jul*_*son 5

这是来自此 OP LINQ 的重复问题:动态选择

\n\n

基于这些答案。

\n\n
public 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()

\n\n

谢谢@T\xe1\xba\xa5n Nguy\xc3\xaan 的回答。

\n