【问题标题】:Expression on Func with multiple parameters具有多个参数的 Func 表达式
【发布时间】:2012-03-06 19:19:54
【问题描述】:

我正在尝试编写一个表达式,该表达式调用一个接受多个参数作为输入的方法,并且该表达式充当 nhibernate 查询引擎的 where 子句。目前我收到一条错误消息:

System.Exception : 无法识别的方法调用:System.Func`3[[MyClass, Assembly, Version=9.123.434, Culture=neutral, PublicKeyToken=null],[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=wjerkwr234],[System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=234234123]]:Boolean Invoke(MyClass, Int32)

 Expression<Func<MyClass, int, bool>> restricton=
         (myClassObject, myNumber) => myClassObject.Property1== myNumber;

session
    .QueryOver<MyClass>()
    .Where(x =>x.Property2==1)
    .And(x=>restriction.Compile().Invoke(x, 2))

我为什么要使用表达式?嗯,这是生成 queryover 语句的函数的一个参数,那里的条件可以改变

知道上面的代码有什么问题吗?

【问题讨论】:

    标签: c# nhibernate delegates expression func


    【解决方案1】:

    linq 提供者需要一个表达式,但你给它一个委托,因为你使用Compile()

    int myNumber = 5;
    Expression<Func<MyClass, bool>> restricton=
         myClassObject => myClassObject.Property1 == myNumber
    
    session.QueryOver().Where(x => x.Property2 == 1).And(restriction)
    

    更新:如果只有在构造查询时才知道

    session.QueryOver().Where(x => x.Property2 == 1).And(CreateRestriction(2))
    
    Expression<Func<MyClass, bool>> CreateRestriction(int myNumber)
    {
        return myClassObject => myClassObject.Property1 == myNumber;
    }
    

    【讨论】:

    • firo 问题是我在构建表达式时无法设置 myNumber,这就是为什么我将它作为第二个参数.. 那么解决方案是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多