我正在利用this project to use jqgrid to filter and sort collections。我看到的一个问题是,当循环遍历集合并检查字符串字段的属性为空时,下面的代码将会爆炸。我想调整下面的代码,以便创建一个lambda,它不仅可以执行“ToString()”和“Contains”,还可以支持属性为null(并将其视为string.empty)
我在这个函数中基本上有2个输入:
,下面的代码动态构建一个表达式来遍历集合,并针对映射到传入的FieldName的属性检查“包含”。
我的代码如下:
ParameterExpression parameter = Expression.Parameter(query.ElementType, "p");
MemberExpression memberAccess = null;
MethodCallExpression memberAccessToString = null;
foreach (var property in column.Split('.'))
{
memberAccess = MemberExpression.Property(memberAccess ?? (parameter as Expression), property);
memberAccessToString = MemberExpression.Call(memberAccess, "ToString", new Type[] {}, new Expression[] {});
}
Expression condition = null;
LambdaExpression lambda = null;
case WhereOperation.Contains:
condition = Expression.Call(memberAccessToString,
typeof(string).GetMethod("Contains"),
Expression.Constant(value));
lambda = Expression.Lambda(condition, parameter);
MethodCallExpression result = Expression.Call(
typeof(Queryable), "Where",
new[] { query.ElementType },
query.Expression,
lambda);
return query.Provider.CreateQuery<T>(result);
答案 0 :(得分:1)
在调用 ToString()
之前,您是否检查过Expression.Coalesce
是否可以将其应用于memberAccess
memberAccess = MemberExpression.Property(memberAccess ?? (parameter as Expression), property);
memberAccessToString = MemberExpression.Call(Expression.Coalesce(memberAccess,Expression.Constant(string.Empty)), "ToString", new Type new Type[] {}, new Expression[] {});
没有测试它,但可能导致解决方案