我试图查询我的地址位置,找出特定半径范围内的地址。以下是我的where子句,results
是IEnumerable<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;。
我该如何解决这个问题?
非常感谢任何帮助。
答案 0 :(得分:0)
你需要使用LINQ表达式,而不是lambdas! 试试这个:
Expression<Func<Address, bool>> predicate = ...
答案 1 :(得分:0)
您的过滤表达式无法转换为SQL。这是一个多行表达式。与任何其他orm LINQ提供程序一样,linq-to-nhibernate需要简单的一个可以转换为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。
但当然这会导致过滤发生在您的应用中而不是数据库中。