基于子实体的属性构建OrderBy Lambda表达式

App*_*ere 11 c# linq lambda expression-trees

我正在尝试OrderBy使用lambda表达式生成LINQ 子句,其中实体的列名称作为字符串的输入(在下面的"sortOn"变量中).

下面的代码适用于sortOn值,例如生成lambda的"Code"

p => p.Code
Run Code Online (Sandbox Code Playgroud)

但我还想对lambda可能存在的子实体进行排序

p => p.Category.Description
Run Code Online (Sandbox Code Playgroud)

所以在这个例子中,我只想设置sortOn ="Category.Description"并生成正确的lamdba表达式.

这可能吗?有关最佳方法的任何建议都会受到欢迎.

此代码适用于简单的情况:

var param = Expression.Parameter(typeof (Product), "p");

var sortExpression = Expression.Lambda<Func<Product, object>>(
    Expression.Property(param, sortOn), param);

if (sortAscending ?? true)
{
   products = products.OrderBy(sortExpression);
}
else
{
   products = products.OrderByDescending(sortExpression);
}
Run Code Online (Sandbox Code Playgroud)

此问题的用例是显示数据网格并能够对数据进行排序,只需将要排序的列名称传递回服务器即可.我想使解决方案通用,但现在已开始使用特定类型(示例中的产品).

小智 18

这将生成正确的lambda表达式:

var sortOn = "Category.Description";
var param = Expression.Parameter(typeof(Product), "p");
var parts = sortOn.Split('.');

Expression parent = param;

foreach (var part in parts)
{
    parent = Expression.Property(parent, part);
}

var sortExpression = Expression.Lambda<Func<Product, object>>(parent, param);
Run Code Online (Sandbox Code Playgroud)