我有两个lambda表达式:
Expression<Func<MyEntity, bool>> e1 = i=>i.FName.Contain("john");
和
Expression<Func<MyEntity, bool>> e2=i=>i.LName.Contain("smith");
i类型来自我的poco实体,不能与invoke一起使用。我想在运行时将它们结合起来。
我想在运行时以类似的方式组合这些表达式:
Expression<Func<MyEntity, bool>> e3 = Combine(e1,e2);
答案 0 :(得分:49)
问题在于你不能只是&#34;和&#34; /&#34;或&#34;他们,因为你需要重新编写内部来改变参数;如果您使用.Body
中的e1
,但使用e2
中的参数,则无法使用 - 因为.Body
{ {1}}引用了一个未定义的完全不相关的参数实例。如果你使用:
e1
(请注意使用Expression<Func<MyEntity, bool>> e1 = i => i.FName.Contains("john");
Expression<Func<MyEntity, bool>> e2 = j => j.LName.Contains("smith");
的{{1}}和使用e1
的{{1}}之间的差异
如果我们将它们组合在一起而不重写参数,我们就会得到荒谬的:
i
(哇...... e2
来自哪里?)
无论其;无论参数的名称如何,问题都是相同的:它仍然是一个不同的参数。
由于表达式是不可变的,你不能只是交换它&#34;到位&#34;。
诀窍是使用&#34;访客&#34;重写节点,如下所示:
j
答案 1 :(得分:0)
using (MyDataBaseEntities db = new MyDataBaseEntities())
{
{
if (db.People.Any(p => p.FirstName == FirstNameText.Text && p.LastName == LastNameText.Text))
{
//Do something
}
}
}
也许带有simpe if语句?
我是新来的朋友,对不起,如果我的回答很愚蠢。