1

有没有更简单的方法来使用 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 }....
4

3 回答 3

1

好吧,我怀疑GymCourt,GymAddress成员的类型都是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.ExprLINQKit(包含 的库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;
}

虽然这并不直接适合您的情况,但最好在您的工具包中使用。

于 2011-12-23T04:27:47.940 回答
0

如果您的意思是压缩初始化您可以对表达式树变量使用 var 关键字并编写特殊的扩展方法 ToExpression ,它只返回给定的表达式(但编译器需要区分 func 和表达式)。

于 2011-12-19T09:53:13.747 回答
0

您可以通过 jb evain查看Mono.Linq.Expressions

于 2012-04-05T17:00:24.063 回答