使用Predicate Builder编写表达式树有一种更简单的方法吗?似乎很多代码都可以压缩。
Expression<Func<EventGymCourt, object>> gymCourt = q => q.GymCourt;
Expression<Func<EventGymCourt, object>> gym = q => q.GymCourt.Gym;
Expression<Func<EventGymCourt, object>> address = q => q.GymCourt.Gym.Address;
_eventGymCourtRepository.GetWithStart(page, pageSize, new[] { gymCourt, gym, address }....
答案 0 :(得分:1)
嗯,我怀疑GymCourt
,Gym
和Address
成员的类型都是object
,因此很难将类型推断到对你有利。
一种方法是使用数组初始值设定项:
Expression<Func<EventGymCourt, object>>[] exprs
= { q => q.GymCourt, q => q.GymCourt.Gym, q => q.GymCourt.Gym.Address };
_eventGymCourtRepository.GetWithStart(page, pageSize, exprs);
如果确实需要在单独的变量中使用每个表达式,可以使用using
- 别名来缩短变量类型声明。
// At the top of your file....
using CourtObjectExpr =
System.Linq.Expressions.Expression<System.Func<MyNameSpace.EventGymCourt, object>>;
...
CourtObjectExpr gymCourt = q => q.GymCourt;
CourtObjectExpr gym = q => q.GymCourt.Gym;
CourtObjectExpr address = q => q.GymCourt.Gym.Address;
顺便说一下,您似乎正在从LINQKit(包含Linq.Expr
的库)中搜索PredicateBuilder
方法。这使用编译器的类型推断功能在典型场景中压缩lambda到表达式树的转换。我不认为这在您的示例中有用,因为您需要将表达式的return-type设置为object
而不是属性类型。
但假设你想创建带有属性类型的表达式作为表达式的返回类型,你可以(非常简洁地)完成:
// Not directly applicable to your scenario (you can add a cast).
var gymCourt = Linq.Expr((EventGymCourt q) => q.GymCourt);
var gym = Linq.Expr((EventGymCourt q) => q.GymCourt.Gym);
var address = Linq.Expr((EventGymCourt q) => q.GymCourt.Gym.Address);
这让编译器类型推理对你有利;该方法的源代码非常简单:
public static Expression<Func<T, TResult>> Expr<T, TResult>
(Expression<Func<T, TResult>> expr)
{
return expr;
}
虽然这不适合您的情况,但最好还是使用您的工具包。
答案 1 :(得分:0)
如果你的意思是冷凝初始化你可以对表达式树变量使用var关键字并编写特殊扩展方法ToExpression,它只返回给定的表达式(但编译器需要它来区分func和表达式)。
答案 2 :(得分:0)
您可以通过jb evain
查看Mono.Linq.Expressions