NHibernate QueryOver реализовал запрос, содержащий подзапросы, не возвращает данные - PullRequest
0 голосов
/ 11 сентября 2018

Я пишу приложение на C #, работающее с базой данных PostgreSql и NHibernate 4.0.0.4000. Я новичок в NHibernate. Мне нужно реализовать следующий запрос SQL, используя NHibernate и QueryOver.

SELECT exa.initiatorlpudisplayedname lpu, exa.creationdate processingbegun,
       (SELECT CASE WHEN transportingordertypeid NOTNULL THEN true ELSE false END
          FROM transportingorders
         WHERE requestpackageid = (SELECT id 
                                     FROM packages 
                                    WHERE examinationid = exa.id)) secondopinion,
       (SELECT name
          FROM transportingorderstatuses
         WHERE id = (SELECT statusid
                       FROM transportingorders
                      WHERE requestpackageid = (SELECT id 
                                                  FROM packages
                                                 WHERE examinationid = exa.id))) status
  FROM examinations exa
 WHERE exa.id IN (SELECT examinationid
                    FROM packages
                   WHERE id IN (SELECT requestpackageid
                                  FROM transportingorders
                                 WHERE transportingordertypeid IN (SELECT id
                                                                     FROM transportingordertypes
                                                                    WHERE code != 'sorscs_second_opinion')))

Таблицы, используемые в SQL, следующие:

create table examinations
(
 id bigserial not null constraint pk_examinations primary key,
 creationdate timestamp not null,
 initiatorlpudisplayedname varchar
);

create table packages
(
 id bigserial not null constraint pk_packages primary key,
 examinationid bigint not null constraint packages_examinationid_fk references examinations,
);

create table transportingorders
(
 id bigserial not null constraint pk_transportingorders primary key,
 statusid bigint not null constraint transportingorders_statusid_fk references transportingorderstatuses,
 requestpackageid bigint not null constraint transportingorders_requestpackageid_fk references packages,
 transportingordertypeid bigint not null constraint transportingorders_transportingordertypeid_fk references transportingordertypes,
);

// The Reference Table
create table transportingordertypes
(
 id bigserial not null constraint pk_transportingordertypes primary key,
 code varchar(50) not null constraint transportingordertypes_code_key unique
);

// The Reference Table
create table transportingorderstatuses
(
 id bigserial not null constraint pk_transportingorderstatuses primary key,
 name varchar(150) not null,
);

И соответственно - сущности:

public class Examination
{
  public virtual int Id { get; set; }
  public virtual DateTime CreationDate { get; set; }
  public virtual string InitiatorLpuDisplayedName { get; set; }
}

public class Package
{
  public virtual int Id { get; set; }
  public virtual Examination Examination { get; set; }
}

public class TransportingOrder
{
  public virtual int Id { get; set; }
  public virtual TransportingOrderStatus Status { get; set; }
  public virtual Package RequestPackage { get; set; }
  public virtual TransportingOrderType OrderType { get; set; }
}

public class TransportingOrderType
{
  public virtual int Id { get; set; }
  public virtual string Code{ get; set; }
}

public class TransportingOrderStatus
{
  public virtual int Id { get; set; }
  public virtual string Name{ get; set; }
}

Моя реализация вышеупомянутого SQL-запроса через QueryOver выглядит следующим образом. Прежде всего, я отдельно определяю запросы из основного предложения WHERE:

var transportingordertypesQuery = QueryOver.Of<TransportingOrderType>().Where(t => t.Code != "sorscs_second_opinion").Select(t => t.Id);
var transportingordersQuery = QueryOver.Of<TransportingOrder>().WithSubquery.WhereProperty(t => t.OrderType.Id).In(transportingordertypesQuery).Select(t => t.RequestPackage.Id);
var packagesQuery = QueryOver.Of<Package>().WithSubquery.WhereProperty(p => p.Id).In(transportingordersQuery).Select(p => p.Examination.Id);

И второе - я реализую вышеупомянутый SQL-запрос с помощью NHibernate QueryOver:

var result = QueryOver.Of<Examination>(() => examinationAlias)
// main WHERE clause :
.WithSubquery.WhereProperty(ex => ex.Id).In(packagesQuery)
// main SELECT clause:
.SelectList(list => list
  // retrieving of InitiatorLpuDisplayedName and CreationDate fields from Examination:
  .Select(ex => ex.InitiatorLpuDisplayedName)
  .Select(ex => ex.CreationDate)
  // subquery for obtaining of "second opinion":
  .SelectSubQuery(
     QueryOver.Of<TransportingOrder>(() => transportingOrderAlias)
     .WithSubquery.Where(() => transportingOrderAlias.RequestPackage.Id ==
        QueryOver.Of<Package>(() => packageAlias).Where(() => packageAlias.Examination.Id == examinationAlias.Id).Select((Package) => packageAlias.Id).As<long>())
     .Select(Projections.Conditional(Restrictions.Eq(Projections.Property(() => transportingOrderAlias.OrderType), null), Projections.Constant(false), Projections.Constant(true))))
  // subquery for obtaining of package status:
  .SelectSubQuery(
    QueryOver.Of<TransportingOrderStatus>(() => transportingOrderStatusAlias)
    .WithSubquery.Where(() => transportingOrderStatusAlias.Id ==
       QueryOver.Of<TransportingOrder>(() => transportingOrderAlias)
       .WithSubquery.Where(() => transportingOrderAlias.RequestPackage.Id ==
          QueryOver.Of<Package>(() => packageAlias).Where(() => packageAlias.Examination.Id == examinationAlias.Id).Select((Package) => packageAlias.Id).As<long>())
          .Select((TransportingOrder) => transportingOrderAlias.Status.Id).As<long>())
    .Select((TransportingOrderStatus) => transportingOrderStatusAlias.Name)));

Моя проблема в том, что запрос, реализованный через NHibernate QueryOver, не возвращает никаких записей, хотя он должен возвращать восемь записей. Что я сделал не так? Пожалуйста, помогите мне.

...