Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多对多上的nHibernate查询覆盖子查询_Nhibernate_Subquery_Queryover - Fatal编程技术网

多对多上的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>(); 
  • 预约(身份证,班奇菲尔德)
  • 任命与会者(任命ID、联系人ID)
  • 联系人(Id、联系人字段)
  • 一个约会可以有一个或多个参与者,这只是一个联系人。我已绘制了以下地图:

    <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表映射到类(使用复合键)来实现,但所有这些选项都是相当大的工作量-这取决于它对您的重要性。在我需要优化系统之前,不值得这样做,这是一个更大的查询的一小部分,它正在变得越来越大…感谢您的建议!