编辑2019-01-31:最新解决方案
我已经按照这里和这里的示例创建了一个带有memberexpressions的泛型排序,但我无法弄清楚我应该如何添加一个"ThenBy"子句,或者在methodcallexpression中组合多个列进行排序.理想情况下,ThenBy应该在跳过之前进行,但它不能,因为它无法看到我使用methodcallexpression创建的orderby子句.GridSortExpression是一个Telerik类 - 它只描述了查询应该排序的列和方向.
任何人都能解释一下吗?这就是我现在所拥有的:
Dim exp As Expressions.Expression(Of Func(Of Product_Catalog, Boolean)) = PredicateBuilder.True(Of Product_Catalog)()
exp = exp.And(Function(e) e.Chapter_Price > 30)
Dim sortExpression As New List(Of GridSortExpression)({New GridSortExpression() With {.SortOrder = GridSortOrder.Descending, .FieldName = "Id"}})
If sortExpression.Count = 0 Then
catalogList = con.Product_Catalogs.AsExpandable.Where(exp).OrderBy(Function(o) o.Item_Type).ThenBy(Function(o) o.Item_Description).Skip(startRowIndex).Take(maximumRows).ToList
Else
Dim param As ParameterExpression = Expression.Parameter(GetType(Product_Catalog), String.Empty)
Dim prop As MemberExpression = Expression.PropertyOrField(param, sortExpression(0).FieldName)
Dim sort As LambdaExpression = Expression.Lambda(prop, param)
Dim source = con.Product_Catalogs.AsExpandable.Where(exp)
Dim resultExp As MethodCallExpression …Run Code Online (Sandbox Code Playgroud) 我的最终目标是遍历lambda表达式中的嵌套属性,并确定是否有任何属性为null,但是我在创建基于成员表达式的新lambda表达式时遇到了问题.
采取这种虚拟方法:
public static void DoStuff<TModelDetail, TValue>(Expression<Func<TModelDetail, TValue>> expr, TModelDetail detail)
{
var memberExpression = expr.Body as MemberExpression;
if (memberExpression == null && expr.Body is UnaryExpression)
{
memberExpression = ((UnaryExpression)expr.Body).Operand as MemberExpression;
}
var pe = Expression.Parameter(typeof(TModelDetail), "x");
var convert = Expression.Convert(memberExpression, typeof(object));
var wee = Expression.Lambda<Func<TModelDetail, object>>(convert, pe);
var hey = wee.Compile()(detail);
}
Run Code Online (Sandbox Code Playgroud)
在Compile.exec行上,我收到以下错误:
从范围''引用的'Blah'类型的变量'x',但它没有定义
其中Blah是TModelDetail的类型.
如何使用MemberExpression构建lambda?我最终想要做的是递归地找到根成员表达式,确定它是否为null,并冒泡并确定每个后续成员表达式是否为空.