Я пишу приложение на 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, не возвращает никаких записей, хотя он должен возвращать восемь записей. Что я сделал не так? Пожалуйста, помогите мне.