2011-07-20 5 views
4

は、私は次のクエリを持っている:これはどのように動作するのですか?サブクエリや他のアイデアを持つNHibernate QueryOver?

Model.RampActiveHour rah = null; 

var defaultWeekQuery = QueryOver.Of<Model.RampAdditionalDefaultWeek>() 
            .Where(adw => adw.Ramp == rah.Ramp && 
              adw.Active && adw.FromDate <= date && 
              adw.ToDate >= date) 
            .Select(adw => adw.ID).Take(1); 
var result = session.QueryOver(() => rah) 
       .Where(ah => ah.DayOfWeek == date.DayOfWeek) 
       .WhereRestrictionOn(ah => ah.Ramp).IsIn((ICollection) ramps) 
       .WithSubquery.WhereProperty(ah=>ah.AdditionalDefaultWeek) 
        .Eq(defaultWeekQuery) 
       .List(); 

結果クエリは次のとおりです。

SELECT 
this_.ID as ID3_0_, 
this_.DayOfWeek as DayOfWeek3_0_, 
this_.Active as Active3_0_, 
this_.SlotsCount as SlotsCount3_0_, 
this_.SlotId as SlotId3_0_, 
this_.SlotLength as SlotLength3_0_, 
this_.Date as Date3_0_, 
this_.ramp_id as ramp8_3_0_, 
this_.additional_default_week_id as additional9_3_0_, 
this_.Previous as Previous3_0_, 
this_.Next as Next3_0_ 
FROM RampActiveHour this_ 
WHERE this_.DayOfWeek = 3 /* ?p0 */ and 
this_.ramp_id in (
    3484 /* ?p1 */, 
    3498 /* ?p2 */) 
and 
    this_.additional_default_week_id = (
     SELECT 
      this_0_.ID as y0_ 
     FROM RampAdditionalDefaultWeek this_0_ 
     WHERE (
      (
       (
        this_0_.ramp_id = this_.ramp_id and 
         this_0_.Active = 1 /* ?p103 */) 
        and 
         this_0_.FromDate <= '2011-07-20T00:00:00.00' /* ?p104 */) 
        and 
         this_0_.ToDate >= '2011-07-20T00:00:00.00' /* ?p105 */) 
        limit 1 /* ?p106 */) 

クエリが正しいです。問題は、私のモデルでは、RampActiveHourのプロパティがAdditionalDefaultWeekと呼ばれ、このプロパティが多対1のRampAdditionalDefaultWeekテーブルにマップされているということです。この多対1の関係は、null(これはデフォルトの週がないことを意味します)またはint(これはアクティブな追加のデフォルトの週があることを意味します)に設定できます。

アクティブなAdditionalDefaultWeekが存在しない場合、サブクエリは空のセットを返し、このため、クエリ全体が空のセットを返すという問題があります。

私は投射について考えました。条件付き投射は、まだこの作業を行うことができます。

ご迷惑をおかけして申し訳ありません。

ありがとうございました。

答えて

9
var result = session.QueryOver(() => rah) 
      .Where(ah => ah.DayOfWeek == date.DayOfWeek) 
      .WhereRestrictionOn(ah => ah.Ramp).IsIn((ICollection) ramps) 
      .WithSubquery.WhereProperty(ah=>ah.AdditionalDefaultWeek).Eq(defaultWeekQuery) 
      .Where(new Disjunction() 
       .Add(Subqueries.WhereProperty(ah=>ah.AdditionalDefaultWeek).Eq(defaultWeekQuery)) 
       .Add(new Conjunction() 
        .Add(Subqueries.WhereNotExists(defaultWeekQuery)) 
        .Add(Restrictions.Where(ah=>ah.AdditionalDefaultWeek == null))) 
      .List(); 

私は、クエリを超えるにはそれほど流暢ないんだけど、そうそこに答えを

+0

おかげで、より良い構文かもしれないが、私が正しく理解している場合、このクエリが作成OR論理ます。つまり、アクティブなデフォルトの週がある場合、このクエリはデフォルトのRampActiveHoursとThe additionalも取得します。 –

+0

他の言葉で私はサブクエリーが空の場合、this_.additional_default_week_idになるwhereステートメントはnullですが、subqueryがnullでない場合this_.additional_default_week_id = number –

+0

私は私の答えを編集します。いいえ、パフォーマンスをabaoutと言うことはできません – Firo

関連する問題