组合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)
创建一个新的表达式作为两者的组合,请参见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));