扩展一个 lambda 表达式

5

我有一个现有的lambda表达式,它是这样创建的:

Expression<Func<Entities.Area, bool>> where = (x => (x.Created > this.Value || (x.Changed != null && x.Changed > this.Value)));

现在,我需要将这个表达式扩展为以下表达式:
Expression<Func<Entities.Area, bool>> whereAdd = (x => x.Client.Id == ClientInfo.CurrentClient.Id);

结果应该是这样的:
Expression<Func<Entities.Area, bool>> where = (x => (x.Created > this.Value || (x.Changed != null && x.Changed > this.Value)) && x.Client.Id == ClientInfo.CurrentClient.Id);

我无法直接更改第一个表达式的创建,因为它不是我的代码。

我希望有人能帮助我如何扩展第一个lambda表达式。


E和Entities.Area是不同的类型吗? - David L
抱歉。不是E,是Entities.Area(相同类型)。 - BennoDual
https://dev59.com/7XRB5IYBdhLWcg3w9Lvn#457328 - Jude
2个回答

2

只需创建一个新的AndAlso表达式,将两个表达式的主体结合起来,并从中创建一个新的lambda表达式:

ParameterExpression param = Expression.Parameter(typeof(Entities.Area), "x");
Expression body = Expression.AndAlso(where.Body, whereAdd.Body);

var newWhere = Expression.Lambda<Func<Entities.Area, bool>>(body, param);

Console.WriteLine(newWhere.ToString());
// x => (((x.Created > Convert(value(UserQuery).Value)) OrElse ((x.Changed != null) AndAlso (x.Changed > Convert(value(UserQuery).Value)))) AndAlso (x.Client.Id == ClientInfo.CurrentClient.Id))

0

2
能否请您[编辑]您的答案,解释一下为什么这段代码可以回答问题?仅有代码的答案是不被鼓励的,因为它们无法教授解决方案。 - DavidPostill
我在上面的评论中首先给出了一个链接。半个小时后,Poke的答案仍未被接受。因此,我修改了Marc Gravel的答案(我已经提供了链接)并发布了它。我能为此做出什么解释呢?老实说,令人惊讶的是,这个问题被投票赞了三次。在SO上有很多关于“AndAlso”的答案。快速搜索就足以找到解决方案。 - Jude
好的,但我建议将你评论中的链接放入答案中作为进一步解释,请参见Combining two expressions (Expression>) - DavidPostill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接