好吧,我怀疑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
-alias 来缩短变量类型声明。
// 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;
顺便说一句,您似乎正在Linq.Expr
从LINQKit(包含 的库PredicateBuilder
)中搜索方法。这使用编译器的类型推断功能将 lambda 转换为典型场景中的表达式树。我认为这在您的示例中并不是那么有用,因为您需要表达式的返回类型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;
}
虽然这并不直接适合您的情况,但最好在您的工具包中使用。