Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 多个列上的Nhibernate QueryOver联接_.net_Nhibernate_Queryover - Fatal编程技术网

.net 多个列上的Nhibernate QueryOver联接

.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

我试图在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
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版本?我尚未在该版本上尝试多个联接。