多对多上的nHibernate查询覆盖子查询
我的数据库中有三个表多对多上的nHibernate查询覆盖子查询,nhibernate,subquery,queryover,Nhibernate,Subquery,Queryover,我的数据库中有三个表 var list=CurrentSession.QueryOver<Appointment>(() => appt) .JoinAlias(()=>appt.Work, ()=>work) .Where(a => (a.StartDate >= start && a.StartDate <= end)
var list=CurrentSession.QueryOver<Appointment>(() => appt)
.JoinAlias(()=>appt.Work, ()=>work)
.Where(a => (a.StartDate >= start && a.StartDate <= end)
&& work.Status==WorkStatus.Active )
.JoinQueryOver<Contact>(a => a.Attendees)
.Where(u => u.Id == assignedTo)
.List<Appointment>();
<class name="Appointment">
<set name ="Attendees" table="AppointmentAttendee">
<key column="AppointmentId"></key>
<many-to-many class="Cutter.Domain.Contact" column="ContactId"/>
</set>
</class>
var list=CurrentSession.QueryOver<Appointment>(() => appt)
.JoinAlias(()=>appt.Work, ()=>work)
.Where(a => (a.StartDate >= start && a.StartDate <= end)
&& work.Status==WorkStatus.Active )
.JoinQueryOver<Contact>(a => a.Attendees)
.Where(u => u.Id == assignedTo)
.List<Appointment>();
编辑到目前为止,我已经得出了以下结论:
var list=CurrentSession.QueryOver<Appointment>(() => appt)
.JoinAlias(()=>appt.Work, ()=>work)
.Where(a => (a.StartDate >= start && a.StartDate <= end)
&& work.Status==WorkStatus.Active )
.JoinQueryOver<Contact>(a => a.Attendees)
.Where(u => u.Id == assignedTo)
.List<Appointment>();
var list=CurrentSession.QueryOver(()=>appt)
.JoinAlias(()=>appt.Work,()=>Work)
。其中(a=>(a.StartDate>=开始和&a.StartDate a.attendes)
.其中(u=>u.Id==assignedTo)
.List();
但我相信这是加入了与与会者的约会,并将限制我返回的与会者
var list=CurrentSession.QueryOver<Appointment>(() => appt)
.JoinAlias(()=>appt.Work, ()=>work)
.Where(a => (a.StartDate >= start && a.StartDate <= end)
&& work.Status==WorkStatus.Active )
.JoinQueryOver<Contact>(a => a.Attendees)
.Where(u => u.Id == assignedTo)
.List<Appointment>();
编辑更多的实验让我明白了这一点。(注意,一些对象从联系人变为用户,但仍然存在相同的问题)
var list=CurrentSession.QueryOver<Appointment>(() => appt)
.JoinAlias(()=>appt.Work, ()=>work)
.Where(a => (a.StartDate >= start && a.StartDate <= end)
&& work.Status==WorkStatus.Active )
.JoinQueryOver<Contact>(a => a.Attendees)
.Where(u => u.Id == assignedTo)
.List<Appointment>();
约会appt=null;
WorkBase work=null;
var subQuery=QueryOver.Of()
.JoinQueryOver(a=>a.InternalAttendes)
.其中(u=>u.Id==assignedTo)
.SelectList(a=>a.Select(c=>c.Id));
var list=CurrentSession.QueryOver(()=>appt)
.JoinAlias(()=>appt.Work,()=>Work)
.Where(a=>(a.StartDate>=start&&a.StartDate只需在子查询中添加一个引用别名的子句(其中(a=>a.Id==appt.Id)):
var list=CurrentSession.QueryOver<Appointment>(() => appt)
.JoinAlias(()=>appt.Work, ()=>work)
.Where(a => (a.StartDate >= start && a.StartDate <= end)
&& work.Status==WorkStatus.Active )
.JoinQueryOver<Contact>(a => a.Attendees)
.Where(u => u.Id == assignedTo)
.List<Appointment>();
约会appt=null;
WorkBase work=null;
var subQuery=QueryOver.Of()
.Where(a=>a.Id==appt.Id)//将其限制为外部查询中的约会
.JoinQueryOver(a=>a.InternalAttendes)
.其中(u=>u.Id==assignedTo)
.SelectList(a=>a.Select(c=>c.Id));
var list=CurrentSession.QueryOver(()=>appt)
.JoinAlias(()=>appt.Work,()=>Work)
.Where(a=>(a.StartDate>=start&&a.StartDate只需在子查询中添加一个引用别名的子句(其中(a=>a.Id==appt.Id)):
var list=CurrentSession.QueryOver<Appointment>(() => appt)
.JoinAlias(()=>appt.Work, ()=>work)
.Where(a => (a.StartDate >= start && a.StartDate <= end)
&& work.Status==WorkStatus.Active )
.JoinQueryOver<Contact>(a => a.Attendees)
.Where(u => u.Id == assignedTo)
.List<Appointment>();
约会appt=null;
WorkBase work=null;
var subQuery=QueryOver.Of()
.Where(a=>a.Id==appt.Id)//将其限制为外部查询中的约会
.JoinQueryOver(a=>a.InternalAttendes)
.其中(u=>u.Id==assignedTo)
.SelectList(a=>a.Select(c=>c.Id));
var list=CurrentSession.QueryOver(()=>appt)
.JoinAlias(()=>appt.Work,()=>Work)
.Where(a=>(a.StartDate>=start&&a.StartDate)您知道是否有一种方法可以强制nhibernate执行子查询而不连接其他两个表吗?使用现有的映射,您可以使用限制以非常丑陋的方式执行。Sql,您也可以使用hql执行此操作(但这样您就失去了Criteria/QueryOver的功能),或者可以通过将AppointmentAttendee表映射到类(使用复合键)来实现,但所有这些选项都是相当大的工作量-这取决于它对您的重要性。在我需要优化系统之前,不值得这样做。这是一个更大的查询的一小部分,它正变得越来越大…感谢您的建议!您知道是否有办法强制nhibernate执行子查询而不加入其他两个tables?使用现有的映射,您可以使用限制以非常丑陋的方式进行映射。Sql,您也可以使用hql进行映射(但随后您将失去Criteria/QueryOver的功能),或者您可以通过将AppointmentAttendee表映射到类(使用复合键)来实现,但所有这些选项都是相当大的工作量-这取决于它对您的重要性。在我需要优化系统之前,不值得这样做,这是一个更大的查询的一小部分,它正在变得越来越大…感谢您的建议!