NHibernate从多对多系列中选择

NHibernate从多对多系列中选择,nhibernate,Nhibernate,我希望NHibernate生成以下SQL,但我在下面的代码中遇到了困难 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

我希望NHibernate生成以下SQL,但我在下面的代码中遇到了困难

   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;
    }
}
这可以工作,但不是强类型(HQL)

var x=Session.CreateQuery(“从ClientContact cc JOIN cc.DefaultRequests R中选择R.Id,其中cc.Id=:contactId”)
.SetParameter(“contactId”,contactId)
.List();
返回x;
你必须扭转局面。我相信费伯的回答也会很好。所以你不必扭转局面。(但你可以。)

ClientContact cAlias=null;
var x=Session.QueryOver()
.JoinAlias(rt=>rt.ClientContacts,()=>cAlias)
.Where(()=>cAlias.Id==ContactId)
.Select(rt=>rt.Id)//不确定要在此处返回什么,Id还是对象)
.List();

尝试使用以下别名:

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>();
ClientContact Cont=null;
RequestType Req=null;
var x=session.QueryOver(()=>Cont)
.其中(()=>Cont.ID==ContactId)
.JoinAlias(()=>Cont.DefaultRequests,()=>Req,JoinType.LeftOuterJoin)

.Select(ignore=>Req.Id)//您好,我无法从RequestType导航到ClientContacts。在这个阶段,我只关注Id。@CRG然后Faber的回答可能会给您期望的结果。您好,Select(()=>Req.Id)似乎有问题。它需要一个客户联系人。有没有关于如何投射到RequestTypes集合中的想法?我在帖子中添加了一个HQL版本。这是可行的,但我真的很想知道如何做到这一点。@CRG我建议编辑费伯的答案。在它被接受之前,使用
.Select(ignore=>Req.Id).List()我对此进行了测试,它应该可以工作。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;
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();
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>();