1

データベースに 3 つのテーブルがあります

  1. 予定 (Id、BunchOfFields)
  2. AppointmentAttendee (AppointmentId,ContactId)
  3. 連絡先 (ID、ContactFields)

予定には、単なる連絡先である 1 人以上の出席者を含めることができます。私はこれらをマッピングしました:

<class name="Appointment">
    <set name ="Attendees" table="AppointmentAttendee">
      <key column="AppointmentId"></key>
      <many-to-many class="Cutter.Domain.Contact" column="ContactId"/>

    </set>
</class>

特定の連絡先があり、特定の時間枠内で開始されるすべての予定 (すべての出席者を含む) を取得する必要があります。これまでのところ、私は持っています:

        CurrentSession.QueryOver<Appointment>()
            .Where(a=>a.StartDate>=start && a.StartDate<=end)

私が必要とするのは、基本的にこのSQLクエリです

SELECT * 
FROM Appointment a
LEFT JOIN OtherTables....
WHERE EXISTS (SELECT * FROM AppointmentAttendee att WHERE a.Id=att.AppointmentId and att.ContactId=?)

編集
これまでのところ、私はこれを思いつきました:

   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>(); 

しかし、これは出席者との予定に参加することであり、私が戻ってくる出席者を制限すると思います.

編集
さらに実験すると、これにたどり着きます。(いくつかのオブジェクトが Contact から User に変更されましたが、それでも同じ問題があることに注意してください)

        Appointment appt=null;
        WorkBase work=null;

        var subQuery = QueryOver.Of<Appointment>()
            .JoinQueryOver<User>(a => a.InternalAttendees)             
            .Where(u => u.Id == assignedTo)
            .SelectList(a => a.Select(c=>c.Id));

        var list=CurrentSession.QueryOver<Appointment>(() => appt)
            .JoinAlias(()=>appt.Work, ()=>work)
            .Where(a => (a.StartDate >= start && a.StartDate <= end)
                && work.Status==WorkStatus.Active )            
            .WithSubquery.WhereExists(subQuery)              
            .List<Appointment>();

サブクエリを取得していますが、サブクエリを親クエリに接続するにはどうすればよいですか。(外部の予定 ID を参照するにはサブクエリが必要です)

また、必要なすべてのデータが関連付けテーブルにあるときに、3 つのテーブルを結合する必要があるサブクエリで、エンティティ テーブルを結合する必要なくこれを行うことができればいいと思います。

4

1 に答える 1

4

エイリアスを参照する句をサブクエリに追加するだけです(Where(a => a.Id == appt.Id)):

    Appointment appt=null;
    WorkBase work=null;

    var subQuery = QueryOver.Of<Appointment>()
        .Where(a => a.Id == appt.Id) // restrict it to Appointment in outer query
        .JoinQueryOver<User>(a => a.InternalAttendees)             
        .Where(u => u.Id == assignedTo)             
        .SelectList(a => a.Select(c=>c.Id));

    var list=CurrentSession.QueryOver<Appointment>(() => appt)
        .JoinAlias(()=>appt.Work, ()=>work)
        .Where(a => (a.StartDate >= start && a.StartDate <= end)
            && work.Status==WorkStatus.Active )            
        .WithSubquery.WhereExists(subQuery)              
        .List<Appointment>();
于 2012-05-22T12:34:24.730 に答える