如何使用Linq创建Multiple属性lambda表达式

时间:2017-08-07 20:53:09

标签: c# .net linq

我用

ParameterExpression parameter = Expression.Parameter(typeof(T), "p");

var myexp=Expression.Lambda<Func<T, TKey>>(Expression.Property(parameter, "myid"), parameter);

像这样创建一个lambda表达式myexp

p=>myid

现在我想创建一个像这样的多属性

p=> new {myid,myid2}

1 个答案:

答案 0 :(得分:2)

执行此操作的棘手部分是访问匿名类型的类型,以便您可以为其调用new。我通常使用LINQPad创建一个示例lambda并将其转储以查看格式:

Expression<Func<Test,object>> lambdax = p => new { p.myid, p.myid2 };
lambdax.Dump();

假设p的类型为Test

class Test {
    public int myid;
    public int myid2;
}

然后,您可以创建Expression来重新创建lambdax值:

var exampleTest = new Test();
var example = new { exampleTest.myid, exampleTest.myid2 };
var exampleType = example.GetType();

var rci = exampleType.GetConstructors()[0];
var parm = Expression.Parameter(typeof(Test), "p");
var args = new[] { Expression.PropertyOrField(parm, "myid"), Expression.PropertyOrField(parm, "myid2") };

var body = Expression.New(rci, args, exampleType.GetMembers().Where(m => m.MemberType == MemberTypes.Property));
var lambda = Expression.Lambda(body, parm);