NHibernate异常:无法转换类型' NHibernate.Hql.Ast.HqlParameter'输入' NHibernate.Hql.Ast.HqlBooleanExpression'

时间:2017-01-19 10:46:56

标签: c# nhibernate fluent-nhibernate

我试图查询我的地址位置,找出特定半径范围内的地址。以下是我的where子句,resultsIEnumerable<Properties>

 Func<Address, bool> predicate = l =>
 {
    if (l.Location == null && l.Longitude.HasValue && l.Latitude.HasValue)
    {
       var point = new Point(l.Longitude.Value, l.Latitude.Value);
       return point.Distance(p) <= 300;
    }
    return false;
  };

  results = results.Where(x => predicate(x.Address));

但是,我从NHibernate获得了一个例外

  

&#34;无法转换类型&#39; NHibernate.Hql.Ast.HqlParameter&#39;的对象输入&#39; NHibernate.Hql.Ast.HqlBooleanExpression&#39;。

我该如何解决这个问题?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

你需要使用LINQ表达式,而不是lambdas! 试试这个:

Expression<Func<Address, bool>> predicate = ...

答案 1 :(得分:0)

您的过滤表达式无法转换为SQL。这是一个多行表达式。与任何其他orm LINQ提供程序一样,需要简单的一个可以转换为SQL的字符串lambda。

此外,您的过滤表达式使用一个执行某些计算的类(在您的情况下为Distance())。除非extend it,否则LINQ提供程序将不知道如何将其转换为SQL。如果可以用SQL可翻译的方式编写,那么最好在lambda中重写你的计算。

如果你需要在许多地方使用谓词,你可以编写一个函数,在使用它之前将它放在局部变量中。

private Expression<Func<Address, bool>> GetFilterByMaxDistance(double maxDistance)
{
    // replace ??? with your computation, without block of code (no `{}`) nor call to 
    // functions not known for being handled by the LINQ provider
    return a => ??? <= maxDistance;
}

...

    var predicate = GetFilterByMaxDistance(300);
    results = results.Where(predicate);

否则,如果您的results本地变量已经过充分过滤&#39;为了获得合理的效果,请在应用过滤器之前致电.AsEnumerable(),这次仅作为Func<Address, bool>,而不是Expression<Func<Address, bool>>

在应用.AsENumerable()之前调用.Where(predicate)将导致谓词在.Net运行时在内存中执行,而无需将其转换为SQL。 但当然这会导致过滤发生在您的应用中而不是数据库中。