2011-04-01 2 views
3

Я хотел NHibernate, чтобы сгенерировать следующий SQL, но я stuggling с кодом нижеNHibernate выбрать из многих ко многим коллекции

SELECT rt.Id 
    FROM ClientContact cc 
    JOIN ClientContact_DefaultRequest d on d.ClientContactID = cc.Id 
    JOIN RequestType rt on d.RequestTypeId = rt.Id 
    WHERE 
    cc.Id = ContactId 



public class GetDefaultRequestsForContact : SimpleQuery<IEnumerable<RequestType>>, IGetDefaultRequestsForContact 
{ 
    public int ContactId { private get; set; } 

    public GetDefaultRequestsForContact(ISession session) : base(session) { } 

    public override IEnumerable<RequestType> Execute() 
    { 
     var x = Session.QueryOver<ClientContact>() 
      .Where(c => c.Id == ContactId) 
      .JoinQueryOver<RequestType>(c => c.DefaultRequests) 
      .Select(c => c.DefaultRequests) 
      .List(); 
     return null; 
    } 
} 

Сгенерированного SQL только выбрать родительский идентификатор (который является параметр) Я хочу все дочерние идентификаторы.

SELECT this_.Id as y0_ 
FROM ClientContact this_ 
     inner join ClientContact_DefaultRequest defaultreq3_ 
     on this_.Id = defaultreq3_.ClientContactID 
     inner join RequestType requesttyp1_ 
     on defaultreq3_.RequestTypeID = requesttyp1_.Id 
WHERE this_.Id = 313706 /* @p0 */ 

Это работает, но не строго типизировано (HQL).

 var x = Session.CreateQuery("SELECT R.Id FROM ClientContact cc JOIN cc.DefaultRequests R WHERE cc.Id = :contactId") 
      .SetParameter("contactId",ContactId) 
      .List<int>(); 
     return x; 
+0

HQL * IS * сильно типизированных. –

ответ

2

Попробуйте использовать псевдонимы, как:

ClientContact Cont = null; 
RequestType Req = null; 

var x = session.QueryOver<ClientContact>(() => Cont) 
.Where(() => Cont.ID == ContactId) 
.JoinAlias(() => Cont.DefaultRequests,()=> Req, JoinType.LeftOuterJoin) 
.Select(ignore => Req.Id) // <-- Select wants a parameter 
.List<int>(); 
+0

Привет, похоже, проблема с Select (() => Req.Id). Он хочет ClientContact. Любые идеи, как проектировать в коллекцию RequestTypes? – CRG

+0

Я добавил версию HQL для публикации. Он работает, но я действительно хотел бы знать, как это сделать строго типизировано. – CRG

+0

@CRG Я предложил отредактировать ответ Фабера. Пока это не будет принято, используйте '.Select (ignore => Req.Id) .List ();' Я тестировал это и должен работать. –

1

Необходимо обернуть его. Я считаю, что ответ Фабера тоже будет хорошо работать. Так что вам не нужно поворачивать его. (Но вы могли бы.)

ClientContact cAlias = null; 

var x = Session.QueryOver<RequestType>() 
    .JoinAlias(rt => rt.ClientContacts,() => cAlias) 
    .Where(() => cAlias.Id == ContactId) 
    .Select(rt => rt.Id) // not sure what you want returned here, Id or the object) 
    .List(); 
+0

Привет, Я не могу перейти от RequestType к ClientContacts. Я только после Ids на этом этапе. – CRG

+0

@CRG Тогда ответ Фабера, вероятно, даст вам желаемый результат. –

Смежные вопросы