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