.net 多个列上的Nhibernate QueryOver联接
我试图在NH中重现此SQL查询:.net 多个列上的Nhibernate QueryOver联接,.net,nhibernate,queryover,.net,Nhibernate,Queryover,我试图在NH中重现此SQL查询: select vehicle.Id, price.Price from vhc.Vehicle vehicle left outer join vhc.VehiclePrice price on vehicle.Id = price.VehicleId and price.VehiclePriceTypeId = 1 where price.Id is null or price.VehiclePriceTypeId = 1 or
select vehicle.Id, price.Price
from vhc.Vehicle vehicle
left outer join vhc.VehiclePrice price on vehicle.Id = price.VehicleId
and price.VehiclePriceTypeId = 1
where price.Id is null or price.VehiclePriceTypeId = 1
order by price.Price
重要的部分是第二个连接标准。我想查看所有车辆,无论它们是否有价格,但如果它们有任何价格,我想选择类型1的价格。删除第二个连接条件意味着它排除了所有价格仅为2、3等类型的车辆。这不好
我尝试过的方法:
- 在VehiclePrice对象上添加全局筛选器以仅在其上进行筛选 VehiclePriceType=1,但它将其放在何处,而不是连接上,因此 那里运气不好
- 为类型为1的价格添加子查询,但它再次将其应用于Where,而不是Join
- 其他联接类型--完全联接,对。。。这似乎没有道理
这是一个常见的问题,只是还没有找到解决办法。有什么想法吗?只是一个想法:在一次往返中使用两个查询
var vehiclesWithPrice = session.QueryOver<Vehicle>()
.JoinQueryOver<VehiclePrice>(vehicle => vehicle.Prices, () => vpricealias)
.Where(price => price.VehiclePriceTypeId == 1)
.OrderBy(() => vpricealias.Price).Asc
.Select(vehicle => vehicle.Id, vehicle => vpricealias.Price)
.Future();
var vehiclesWithoutPrice = session.QueryOver(() => vehiclealias)
.WithSubquery.WhereNotExists(QueryOver.Of<VehiclePrice>()
.Where(price => price.Vehicle.Id == vehiclealias.Id)
.Where(price => price.VehiclePriceTypeId == 1)
)
.Select(vehicle => vehicle.Id, vehicle => 0)
.Future();
var vehiclesprices = vehiclesWithoutPrice.Concat(vehiclesWithPrice);
var vehiclesWithPrice=session.QueryOver()
.JoinQueryOver(车辆=>车辆价格,()=>车辆价格)
.Where(price=>price.VehiclePriceTypeId==1)
.OrderBy(()=>vpricealias.Price).Asc
.选择(vehicle=>vehicle.Id,vehicle=>vpricealias.Price)
.Future();
var vehiclesWithoutPrice=session.QueryOver(()=>vehiclealias)
.WithSubquery.WhereNotExists(QueryOver.Of()的)
.Where(price=>price.Vehicle.Id==vehiclealias.Id)
.Where(price=>price.VehiclePriceTypeId==1)
)
.选择(vehicle=>vehicle.Id,vehicle=>0)
.Future();
var Vehicles Prices=无价格的车辆。Concat(有价格的车辆);
只是一个想法:在一次往返中使用两个查询
var vehiclesWithPrice = session.QueryOver<Vehicle>()
.JoinQueryOver<VehiclePrice>(vehicle => vehicle.Prices, () => vpricealias)
.Where(price => price.VehiclePriceTypeId == 1)
.OrderBy(() => vpricealias.Price).Asc
.Select(vehicle => vehicle.Id, vehicle => vpricealias.Price)
.Future();
var vehiclesWithoutPrice = session.QueryOver(() => vehiclealias)
.WithSubquery.WhereNotExists(QueryOver.Of<VehiclePrice>()
.Where(price => price.Vehicle.Id == vehiclealias.Id)
.Where(price => price.VehiclePriceTypeId == 1)
)
.Select(vehicle => vehicle.Id, vehicle => 0)
.Future();
var vehiclesprices = vehiclesWithoutPrice.Concat(vehiclesWithPrice);
var vehiclesWithPrice=session.QueryOver()
.JoinQueryOver(车辆=>车辆价格,()=>车辆价格)
.Where(price=>price.VehiclePriceTypeId==1)
.OrderBy(()=>vpricealias.Price).Asc
.选择(vehicle=>vehicle.Id,vehicle=>vpricealias.Price)
.Future();
var vehiclesWithoutPrice=session.QueryOver(()=>vehiclealias)
.WithSubquery.WhereNotExists(QueryOver.Of()的)
.Where(price=>price.Vehicle.Id==vehiclealias.Id)
.Where(price=>price.VehiclePriceTypeId==1)
)
.选择(vehicle=>vehicle.Id,vehicle=>0)
.Future();
var Vehicles Prices=无价格的车辆。Concat(有价格的车辆);
现在使用QueryOver可以做到这一点(我不知道什么时候,但是我以前尝试过这样做,但无法做到)
var-vpAlias=null;
var prices=session.QueryOver()
.Left.JoinAlias(x=>x.VehiclePrice,()=>vpAlias,x=>x.VehiclePriceTypeId==1)
.其中(()=>vpAlias.Id==null | | vpAlias.VehiclePriceTypeId==1)
.Select(x=>x.Id,()=>vpAlias.Price)
.ToList();
您将需要为要在多个字段上加入的实体创建别名,但是您似乎可以使用
JoinAlias
或JoinQueryOver
来创建别名,它们只返回不同的实体。现在使用QueryOver可以实现这一点(我不知道是什么时候,但是我以前试过这么做,但是做不到)
var-vpAlias=null;
var prices=session.QueryOver()
.Left.JoinAlias(x=>x.VehiclePrice,()=>vpAlias,x=>x.VehiclePriceTypeId==1)
.其中(()=>vpAlias.Id==null | | vpAlias.VehiclePriceTypeId==1)
.Select(x=>x.Id,()=>vpAlias.Price)
.ToList();
您将需要为要在多个字段中加入的实体创建别名,但是您似乎可以使用
JoinAlias
或JoinQueryOver
来创建别名,它们只返回不同的实体。谢谢。我将对此保持关注。HQL使用with子句为此提供。t中是否有等效项他是QueryOver API?谢谢。我会关注这一点。HQL使用WITH子句为此提供。QueryOver API中是否有等效项?您是否正在运行新的3.3版本?我尚未在该版本上尝试多个联接。您是否正在运行新的3.3版本?我尚未在该版本上尝试多个联接。