0

バックグラウンド:

  • マスター テーブルと詳細テーブル、M と D があります。
  • M には注文が含まれ、D にはさまざまなサイズ (S、M、L、XL) のパーツを含む注文の詳細が含まれます。
  • 特定の注文には、任意の数の部品が含まれる場合があります。
  • すべての注文の 95% に、サイズ S のアイテムが少なくとも 1 つ含まれています。
  • 新しい要件は、サイズが将来追加される可能性があるため、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 でこれを実装する方法がわかりません。

提案?

4

1 に答える 1

1

dotjoe が示唆したように、having句は一時変数にプロジェクションを格納し、それをプロジェクション リストと制限リストの両方で使用することによって達成されると思いますが、ICriteriaクエリではなくQueryOver.

このクエリを作成するもう 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ますが、楽しみを台無しにしたくありません。正しい方向に向けるのに十分ですか?

于 2011-11-11T03:45:37.607 に答える