2009-11-03 91 views
2

如何创建一个动态lambda表达式来传递在linq中的orderby函数中使用?动态创建lambdas表达式+ linq + OrderByDescending

我基本上想变换queryResults.OrderByDescending();queryResults.OrderByDescending(myCustomGeneratedLambdaExp);其中myCustomGeneratedLambdaExp应该是包含x => x.name的字符串。

感谢

回答

4

我不知道确切的地方,你需要动态lambda表达式。无论如何,动态生成lambda表达式的最好方法是使用表达式树。以下是关于这个问题的两个很好的教程:

此代码生成一个lambda表达式像你问(“X => x.name的一个“):

MemberInfo member = typeof(AClassWithANameProperty).GetProperty("Name"); 

//Create 'x' parameter expression 
ParameterExpression xParameter = Expression.Parameter(typeof(object), "x"); 

//Create body expression 
Expression body = Expression.MakeMemberAccess(targetParameter, member); 

//Create and compile lambda 
var lambda = Expression.Lambda<LateBoundGetMemberValue>(
    Expression.Convert(body, typeof(string)), 
    targetParameter 
); 
return lambda.Compile(); 

希望这有助于

+0

感谢您的好例子!这对我帮助很大! – 2009-11-03 16:02:36

+1

请注意,第一个链接已死亡 – 2017-05-19 20:53:13

2

Dynamic LINQ

或者,你可以使用switch语句,反射或dynamic类型在C#4返回根据提供的字段名的值。

这也被做死previously

+0

非常感谢您的输入!我的观点是避免开关代码和反射使其变慢。 – 2009-11-03 16:02:05

+0

是的,有道理。祝你好运。使用动态和/或Iron *比动态LINQ或reflection.emit或Expression.Compile更干净,尽管如果你想保持你的代码可维护和清洁IMO。 – 2009-11-03 17:25:22

+0

再次感谢您的宝贵意见。 – 2009-11-04 12:20:40