首页 > 解决方案 > 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:我非常感谢您的启发,感谢您的宝贵时间。

标签: c#linq

解决方案


这是来自此 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 的回答。


推荐阅读