如何在不使用Invoke方法的情况下组合两个lambda表达式?

时间:2012-05-16 07:01:07

标签: c# linq lambda expression

我有两个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);

2 个答案:

答案 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语句?

我是新来的朋友,对不起,如果我的回答很愚蠢。