2011-11-10 3 views
0

背景:私が一致するレコードの数に対してNHibernateは基準を含めることができますどのように

  • 私はマスターとディテールテーブル、MおよびDを持っています。
  • Mには注文が含まれ、Dにはさまざまなサイズの部品(S、M、L、XL)の注文詳細が含まれます。
  • 注文にはいくつでも部品が含まれる場合があります。すべての注文の
  • 95%がサイズSの少なくとも一つの項目が含まれている
  • 新しい要件は、サイズがSMLXLは、もはや私が探しています

を働くために一生懸命リストをコーディングしない、将来的に追加することができるということです特定のサイズのパーツだけを含むすべての注文Mのリストを返すnHibernateクエリです。

つまり、サイズSの部分のみを含むすべての注文を返し、サイズの混合物を含むすべての注文を除外します。

私が使っていた:

matching_orders.Add(
Expression.Conjunction() 
.Add(Subqueries.WhereProperty<Orders>(o => o.OrderId).In(DetailQueryOver(S))) 
.Add(Subqueries.WhereProperty<Orders>(o => o.OrderId).NotIn(DetailQueryOver(M))) 
.Add(Subqueries.WhereProperty<Orders>(o => o.OrderId).NotIn(DetailQueryOver(L))) 
.Add(Subqueries.WhereProperty<Orders>(o => o.OrderId).NotIn(DetailQueryOver(XL))) 

をより良い方法があるに違いありません。 "count(DISTINCT SIZES)= 1"のようなもの

しかし、これをnHibernateでどのように実装するかはわかりません。

提案?

+1

NHは 'having'節をまだサポートしていますか?次のような場所でサブクエリを使うことができます。 '1 =(select count(distinct sizes)from ...)' – dotjoe

答えて

1

dotjoeが示唆したように、私は私だけICriteriaクエリ、ないQueryOverであることをやったのにhaving節は、射影リストと制限リストの両方でそれを使用して、その後、一時変数に投影をスタッシュによって達成されると信じています。

このクエリを書き込むもう1つの方法は、2つのサブクエリを使用することです.1つは探しているサイズを表し、もう1つは他のすべてのサイズを表します。以下のような何か...

select * 
from Orders o 
where 
    exists (
     select d1.Id 
     from OrderDetail d1 
     where 
      d1.Order_id = o.Id 
      and d1.Size = @size) 
    and not exists (
     select d2.Id 
     from OrderDetail d2 
     where 
      d2.Order_id = o.Id 
      and d2.Size <> @size); 

我々は新たな一歩さらに、この答えを取るとQueryOverクエリにこれを翻訳し、私はあなたの楽しみを台無しにしたくないんでした。それはあなたを正しい方向に向けさせるのに十分ですか?

関連する問題