【问题标题】:QueryOver error : Unrecognised method call in expression valueQueryOver 错误:表达式值中的方法调用无法识别
【发布时间】:2012-02-21 12:37:43
【问题描述】:

我在 Nhibernate3.1 中有一个 QueryOver 的查询

 var q = SessionInstance.QueryOver<Person>()
         .Where(x => IsActive(x.PersonType) == true);

 return q.List<Person>();

通过这种方法:

private bool IsActive(PersonType type)
{
   if(type == PersonType.Employee
      return true;
   else
      return false;
}

现在这个消息出现运行时错误:

表达式值中无法识别的方法调用

为什么?

【问题讨论】:

    标签: c# nhibernate queryover


    【解决方案1】:

    我通过在谓词方法中返回表达式树而不是直接返回布尔值来解决了类似的问题。使用你的例子,它会是这样的:

    private Expression<Func<PersonType, bool>> IsActive()
    {
        return (t => t == PersonType.Employee );
    }
    

    【讨论】:

    • 这是正确答案。用法很简单 QueryOver().Where(IsActive) 非常好。
    【解决方案2】:

    Your Method IsActive 是直接编译为 IL 的方法。查询分析器无法剖析此方法并从中构建查询。我不确定如何从方法中公开表达式并在 NHibernate 查询中使用它,但我相信 google 可以帮助您。

    【讨论】:

      【解决方案3】:

      你不能只做这个吗?

      var q = SessionInstance.QueryOver<Person>()
               .Where(x => x.PersonType == PersonType.Employee);
      

      【讨论】:

      • 没有。我想在这个查询中使用另一种方法。 IsActive 方法是我的示例的简单方法!
      • 也许你应该包括你的更复杂的例子。
      • 本着简洁代码的精神,不需要更复杂的示例。 IsActive 比谓词更能揭示意图。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多