gpt4 book ai didi

c# - NHibernate QueryOver order by 带算术运算

转载 作者:太空宇宙 更新时间:2023-11-03 15:31:48 25 4
gpt4 key购买 nike

我已经构建了一个 HQL 来使用 CreateQuery 查询一些实体,我正在尝试使用 QueryOver 将它转换为 lambda 表达式。

查询查找 NegocioLatitude 范围内和 Longitude ,并按用户与 Negocio 之间的距离对它们进行排序.我想将它转换为 lambda 表达式,因为它更易于维护,但我被部分顺序卡住了。

这些是我拥有的实体。我省略了与这种情况无关的内容。

public class Negocio
{
public Endereco Endereco {get; set;}
}

public class Endereco
{
public GeoCoordenada GeoCoordenada {get; set;}
}
public class GeoCoordenada
{
public double Latitude {get; set;}
public double Longitude {get; set;}
}

这是神奇的查询:

query = _session.CreateQuery(@"select distinct(n),
SQRT(SQUARE(e.GeoCoordenada.Latitude - :lat) + SQUARE(e.GeoCoordenada.Longitude - :lon))
from Negocio n inner join n.Endereco as e where
(e.GeoCoordenada.Latitude between (:minLat) and (:maxLat)) and
(e.GeoCoordenada.Longitude between (:minLon) and (:maxLon))
order by SQRT(SQUARE(e.GeoCoordenada.Latitude - :lat) +
SQUARE(e.GeoCoordenada.Longitude - :lon))");`

query.SetParameter("minLat", -90); // random values just
query.SetParameter("maxLat", 90); // for testing
query.SetParameter("minLon", -180);
query.SetParameter("maxLon", 180);
query.SetParameter("lat", 25);
query.SetParameter("lon", 25);

这就是我现在得到的:

 var query = _session.QueryOver<Negocio>()
.JoinQueryOver(x => x.Endereco)
.WhereRestrictionOn(x => x.GeoCoordenada.Latitude).IsBetween(-90).And(90)
.AndRestrictionOn(x => x.GeoCoordenada.Longitude).IsBetween(-180).And(180)

重要提示:我无法在调用 List() 后对它们进行排序,因为将在带有 skip() 的查询末尾添加分页功能。和 take() , 所以一次查询所有结果是没有意义的

关于如何实现这种排序有什么想法吗?

最佳答案

您可以使用 ArithmeticOperatorProjection,这是为 NHibernate 编写的一个小扩展:http://savale.blogspot.ru/2011/04/nhibernate-and-missing.html

您的查询看起来像这样:

_session.QueryOver<Negocio>()
.JoinQueryOver(x => x.Endereco)
.JoinQueryOver(x => x.GeoCoordenada)
.WhereRestrictionOn(x => x.Latitude).IsBetween(-90).And(90)
.AndRestrictionOn(x => x.Longitude).IsBetween(-180).And(180)
.OrderBy(
new ArithmeticOperatorProjection(
"+",
NHibernateUtil.Decimal,
new ArithmeticOperatorProjection(
"*",
NHibernateUtil.Decimal,
new ArithmeticOperatorProjection("-", NHibernateUtil.Decimal, Projections.Property<GeoCoordenada>(x => x.Longitude), Projections.Constant(25m)),
new ArithmeticOperatorProjection("-", NHibernateUtil.Decimal, Projections.Property<GeoCoordenada>(x => x.Longitude), Projections.Constant(25m))
),
new ArithmeticOperatorProjection(
"*",
NHibernateUtil.Decimal,
new ArithmeticOperatorProjection("-", NHibernateUtil.Decimal, Projections.Property<GeoCoordenada>(x => x.Latitude), Projections.Constant(25m)),
new ArithmeticOperatorProjection("-", NHibernateUtil.Decimal, Projections.Property<GeoCoordenada>(x => x.Latitude), Projections.Constant(25m))
)
)
.List();

这可以通过添加自定义 SQRTSQUARE 投影进一步改进。

关于c# - NHibernate QueryOver order by 带算术运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33523933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com