动态创建lambdas表达式+ linq + OrderByDescending

Asked
Viewd5676

2

如何创建动态lambda表达式以传递给linq中的orderby函数使用?

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

谢谢

2 个答案

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

希望这会有所帮助

  • 感谢一个很好的例子!这对我有很大帮助!

    byte_slaveNovember 03, 2009 16:02
  • 请注意,第一个链接已死

    Peter MMay 19, 2017 20:53
2

请参见动态LINQ

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

这也已经死了以前

  • 非常感谢您的输入!我的观点是避免切换代码和反射使它变慢。

    byte_slaveNovember 03, 2009 16:02
  • 是的,很有道理。祝你好运。使用动态和/或Iron *比动态LINQ或reflect.emit或Expression.Compile更干净。但是,如果您要保持代码的可维护性和Clean IMO,则可以。

    Ruben BartelinkNovember 03, 2009 17:25
  • 再次感谢您的宝贵意见。

    byte_slaveNovember 04, 2009 12:20