如何使用Linq进行多重属性Lambda表达式 [英] How can I make a Multiple property lambda expression with Linq

查看:109
本文介绍了如何使用Linq进行多重属性Lambda表达式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用

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

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

创建这样的lambda表达式myexp

to create a lambda expression myexp like this

p=>myid

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

now I wanna create a mult property like this

p=> new {myid,myid2}

推荐答案

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

The tricky part of doing this is accessing the anonymous type's type so you can call new for it. I normally use LINQPad to create a sample lambda and dump it to see the format:

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值:

Then you can create Expressions to recreate the lambdax value:

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);

这篇关于如何使用Linq进行多重属性Lambda表达式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆