我正在使用这个动态linq orderby函数,我从这里得到它。
这对于嵌套属性很有效,所以我可以这样做:
var result = data.OrderBy("SomeProperty.NestedProperty");
问题在于如果SomeProperty为空,则对NestedProperty执行OrderBy操作时会抛出臭名昭著的“对象引用未设置为对象实例”的异常。
我猜想我需要自定义以下代码行以处理异常:
expr = Expression.Property(expr, pi);
// Or
LambdaExpression lambda = Expression.Lambda(delegateType, expr, arg);
我曾考虑创建一个语句体,在最坏的情况下使用try catch,但这并不起作用,因为在linq语句中orderby排序无法使用语句体:“带有语句体的lambda表达式无法转换为表达式树”。
我很困惑,请问有什么建议可以实现这个功能吗?
顺便说一句,这是针对于Linq to Objects,与数据库无关。
expr = Expression.Property(expr, pi);
会将expr
设置为 null,而后续的代码没有处理它。最简单的解决方法是expr = Expression.Property(expr, pi) ?? default(T);
。但是在这种情况下,您需要检查是否满意所应用的顺序。 - Tommi