Упорядочение NHibernate по количеству дочерней коллекции - PullRequest
0 голосов
/ 28 января 2019

У меня есть две таблицы: АВТОМОБИЛЬ и ПАССАЖИР.Автомобиль может вместить несколько пассажиров.поэтому в таблице PASSENGER есть столбец vehicleId.Мне нужно отфильтровать и заказать мой вид, в котором отображаются транспортные средства по количеству пассажиров.

VehicleEntity и PassengerEntity используются для сопоставления с базой.

public class VehicleEntity
{
  public virtual long DbId {get; set;}
  public virtual string licence {get; set;}

  public virtual ISet<PassengerEntity> Passengers {get; set;}
}

public class VehicleEntityMap : ClassMap<VehicleEntity>
{
  Table("Vehicle");

  Id(x => x.DbId)

  Map(x => x.licence);
  HasMany(x => x.Passengers).KeyColumn("VehicleDbID).Inverse();
}

и PassengerEntity

public class PassengerEntity
{
  public virtual DbId {get; set;}
  public virtual VehicleEntity Vehicle {get; set;}
}

public class PassengerEntityMap : ClassMap<PassengerEntity>
{
  Table("Passenger");

  Id(x => x.DbId)

  References(p => p.Vehicle).Column("VehicleDbId).Index("IXFK_Passenger_Vehicle");
  HasMany(x => x.Passengers).KeyColumn("VehicleDbID).Inverse();
}

Я управлял фильтрующей частью, используя следующее:

VehicleEntity v = null;
PassengerEntity p = null;
IQueryOver<VehicleEntity , VehicleEntity > orderQuery=
            context.Session.QueryOver<VehicleEntity >(() => o);

orderQuery = orderQuery.Left.JoinAlias(() => o.Vehicles, () => v);
subQuery = QueryOver.Of<PassengerEntity>(() => p)
              .Where(() => p.Vehicle.DbId == v.DbId)
              .ToRowCountQuery();
orderFilterQuery = orderQuery.WithSubquery.WhereValue(2).Eq(sbuQuery);

Теперь мне нужно отсортировать автомобили по asc / desc в зависимости от количества пассажиров.

1 Ответ

0 голосов
/ 29 января 2019

Вы можете использовать тот же подзапрос для .OrderBy(), используя Projection.(Между прочим, если вы отфильтруете записи, как в своем примере, то сортировка по количеству пассажиров не принесет больших результатов, поскольку вы получите записи только с тем же количеством пассажиров.)

orderQuery.OrderBy(Projections.SubQuery(subQuery)).Asc;

Результирующий SQL будет выглядеть примерно так:

ORDER BY (SELECT count(*) as y0_ FROM PASSENGERS this_0_ WHERE this_0_.DBID = this_.DBID) asc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...