使用fieldname作为字符串从现有列表中选择单列作为列表

时间:2014-09-08 08:35:05

标签: c# linq lambda

尽管Linq和Lambda上有很多示例和线程,但我似乎找不到使用fieldname从现有列表中选择单个字段的方法。 我觉得我对这段代码比较接近,但是有一个我不理解的错误:

           var parameter = Expression.Parameter(typeof(returnEntityType), "item");
           var propertyAccess = Expression.Property(parameter, vi.BRONVELD);
           var projection = Expression.Lambda(propertyAccess, parameter);

           var test = resultList.Select<returnEntityType, string>(projection).ToList();

有任何想法如何完成这项工作? 非常感谢,谢谢。

2 个答案:

答案 0 :(得分:1)

如果resultList的类型为IQueryable<returnEntityType>并且您正在使用它来构建某种数据库查询,那么您需要向Expression.Lambda方法添加类型参数:

var projection = Expression.Lambda<Func<returnEntityType, string>>(propertyAccess)

否则,如果它只是一个简单的列表或数组,那么使用Dynamic Linq会更简单:https://github.com/kahanu/System.Linq.Dynamic

答案 1 :(得分:1)

你很亲密。这样的事情应该有效:

    class Class
    {
        public string A { get; set; }
        public string B { get; set; }
    }

    static Func<Class, string> GetLambda()
    {
        var parameter = Expression.Parameter(typeof(Class), "item");
        var property = Expression.Property(parameter, "A");
        var projection = Expression.Lambda<Func<Class, string>>(property, parameter);

        return projection.Compile();
    }

    static void Main(string[] args)
    {
        List<Class> list = new List<Class>();

        list.Add(new Class() { A = "class1-a", B = "class1-b" });
        list.Add(new Class() { A = "class2-a", B = "class2-b" });

        var select = list.Select(GetLambda()).ToList();
    }