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)