NHibernate - Projection.Property по отдельным критериям с псевдонимом

Я создаю полусложный запрос отчета (возможно, это не лучший способ, но он отлично работает до этой проблемы).

// total appointments
var appts = DetachedCriteria.For<Appointment>("appt")
    .CreateAlias("Lead", "lead")
    .CreateAlias("lead.Promoter", "leadPromoter", JoinType.LeftOuterJoin)
    .Add(Restrictions.EqProperty("leadPromoter.Id", "promoter.Id"))
    .SetProjection(Projections.ProjectionList()
                                   .Add(Projections.CountDistinct("appt.Id"));

// total sales
var sales = DetachedCriteria.For<Appointment>("sales")
    .CreateAlias("Lead", "lead")
    .CreateAlias("Sale", "sale")
    .CreateAlias("lead.Promoter", "leadPromoter", JoinType.LeftOuterJoin)
    .Add(Restrictions.EqProperty("leadPromoter.Id", "promoter.Id"))
    .SetProjection(Projections.ProjectionList()
                                   .Add(Projections.CountDistinct("sales.Id"));

var projections = Projections.ProjectionList()
    .Add(Projections.SubQuery(appts), "Appointments")
    .Add(Projections.SubQuery(sales), "Sales");


var reports = Session.CreateCriteria<Promoter>("promoter")
                .SetProjection(projections)
                .SetResultTransformer(Transformers.AliasToBean(typeof(PromoterReportDto)))
                .List<PromoterReportDto>();

Это работает нормально и возвращает правильные результаты, однако теперь мне нужно ввести предложение where в каждый из прогнозов (количество встреч, количество продаж и т. Д.) В будний день каждого прогноза.

Для этого я добавил в свои прогнозы:

// total appointments
var appts = DetachedCriteria.For<Appointment>("appt")
    .CreateAlias("Lead", "lead")
    .CreateAlias("lead.Promoter", "leadPromoter", JoinType.LeftOuterJoin)
    .Add(Restrictions.EqProperty("leadPromoter.Id", "promoter.Id"))
    .Add(Restrictions.Eq(
                        Projections.SqlFunction("day", NHibernateUtil.DateTime, Projections.Property("appt.AppointmentDate")), selectedDayOfWeek)
                    )
    .SetProjection(Projections.ProjectionList()
                                   .Add(Projections.CountDistinct("appt.Id"));

// total sales
var sales = DetachedCriteria.For<Appointment>("sales")
    .CreateAlias("Lead", "lead")
    .CreateAlias("Sale", "sale")
    .CreateAlias("lead.Promoter", "leadPromoter", JoinType.LeftOuterJoin)
    .Add(Restrictions.EqProperty("leadPromoter.Id", "promoter.Id"))
    .Add(Restrictions.Eq(
                        Projections.SqlFunction("day", NHibernateUtil.DateTime, Projections.Property("sales.AppointmentDate")), selectedDayOfWeek)
                    )
    .SetProjection(Projections.ProjectionList()
                                   .Add(Projections.CountDistinct("sales.Id"));

;

Однако он жалуется на эту ошибку:

NHibernate.QueryException: не удалось найти продажу недвижимости.

Свойство определенно существует, если я удалю псевдоним в Projection.Property (Projection.Property ("AppointmentDate")), он будет работать, однако он создает этот SQL:

       and datepart(day, this_0_.AppointmentDate) = 0 /* @p4 */
       and datepart(day, this_0_.AppointmentDate) = 0 /* @p5 */
       and datepart(day, this_0_.AppointmentDate) = 0 /* @p6 */
       and datepart(day, this_0_.AppointmentDate) = 0 /* @p7 */
       and datepart(day, this_0_.AppointmentDate) = 0 /* @p8 */
       and datepart(day, this_0_.AppointmentDate) = 0 /* @p9 */
       and datepart(day, this_0_.AppointmentDate) = 0 /* @p10 */) as y0_,

Как видите, он использует первый экземпляр моей сущности, а не сущность для каждого конкретного отдельного критерия.

Извините за длинный вопрос, я не совсем уверен, как объяснить проблему без всего кода и т. Д.

При необходимости я могу вставить еще код / ​​SQL.

Павел


person Paul Hinett    schedule 10.10.2011    source источник
comment
Небольшая информация о лиде, промоутере, назначении и продаже может помочь.   -  person Newbie    schedule 28.10.2011
comment
Запросы критериев устарели (почти)   -  person emperon    schedule 30.10.2011


Ответы (1)


Я думаю, проблема может заключаться в том, что вы используете псевдоним для своего подзапроса как «Продажи», но вы уже определили псевдоним «продажи» в отдельных критериях. Sql, безусловно, не чувствителен к регистру (и я не думаю, что псевдонимы NHibernate?)

В любом случае, я бы попробовал изменить псевдоним в списке проекций, например,

var projections = Projections.ProjectionList()
   .Add(Projections.SubQuery(appts), "Appointments")
   .Add(Projections.SubQuery(sales), "MySales");

Чтобы у вас не было двух потенциально конфликтующих псевдонимов.

person Nathan    schedule 31.10.2011