组合Lambda表达式

本文关键字:表达式 Lambda 组合 | 更新日期: 2023-09-27 18:23:48

我有这个方法

public Expression<Func<Auction, bool>> GetUnsetDatesAuctionsExpression()
        {
            if (condition)
                return GetAllUnsetDatesAuctionsExpression();
            else
                return (a =>
                        (membershipUser.ProviderUserKey != null) &&
                        (a.OwnerReference == (Guid)membershipUser.ProviderUserKey) &&
                        ((a.Starts == null) || (a.Ends == null)));
            }
        }

称这种方法为

private Expression<Func<Auction, bool>> GetAllUnsetDatesAuctionsExpression()
        {
            return (a => (a.Starts == null) || (a.Ends == null));
        }

问题是,在上面的公开方法中,我有下面的

(a.Starts == null) || (a.Ends == null)

其与私有方法中的表达式的主体相同。

当然,这样做是行不通的,因为你不能对布尔和表达式进行AND运算

return (a =>
   (membershipUser.ProviderUserKey != null) &&
   (a.OwnerReference == (Guid)membershipUser.ProviderUserKey) &&
   (GetAllUnsetDatesAuctionsExpression));

所以,问题是,我如何将对私有方法的调用与结合起来

(membershipUser.ProviderUserKey != null) &&
   (a.OwnerReference == (Guid)membershipUser.ProviderUserKey)

组合Lambda表达式

创建一个新的表达式作为两者的组合,请参见BinaryExpression:

System.Linq.Expressions.BinaryExpression binaryExpression =
  System.Linq.Expressions.Expression.MakeBinary(
    System.Linq.Expressions.ExpressionType.AndAlso,
    firstExpression,
    secondExpression);

尝试以下操作(我删除了多余的括号):

return a =>
    membershipUser.ProviderUserKey != null &&
    a.OwnerReference == (Guid)membershipUser.ProviderUserKey &&
    GetAllUnsetDatesAuctionsExpression().Compile()(a);
    // ---------------------------------^^^^^^^^^^^^^

上面的代码使用Expression.Compile方法将表达式树(由GetAllUnsetDatesAuctionsExpression()方法返回)描述的lambda表达式编译为可执行代码,并生成表示lambda表达式的委托。

编辑:我没有注意到您的公共方法返回了一个表达式,而不是一个值。当然,在你的场景中,Hans Kesting的方法要好得多。

你能不改变它这个表达式吗:

return (a => (a.Starts == null || a.Ends == null));