2

Orderに多数の が含まれLineItems、それぞれLineItemに が関連付けられているオブジェクト モデルがありますProduct。オブジェクト モデルでは、これらは一方向の関連付けであり、 aLineItemはその について何も知りませんOrder

クラス図

文字列に一致する製品名を持つ品目を含む注文をクエリし、注文ごとに 1 行を返します (ページングを実行できるようにするため)。

SELECT * FROM Orders 
WHERE OrderID IN (
    SELECT DISTINCT OrderID 
    FROM LineItems 
    INNER JOIN Products on LineItems.ProductID = Products.ProductID
    WHERE Products.Name = 'foo'
)

ICriteriaサブクエリを表すまたはがある場合、IQueryOverそれをルートの Order クエリに実際に適用するにはどうすればよいでしょうか?

var subquery = QueryOver.Of<LineItem>
                        .Where(l => l.Product.Name == "foo")
                        .TransformUsing(Transformers.DistinctRootEntity);

クエリのルート オブジェクトが 1 対多の関係の「多」側にあると仮定する例をたくさん見つけましたが、ルート オブジェクトが持つものに制限を追加する方法がわかりません。の多く

4

2 に答える 2

3

効率的なクエリを可能にする (必要な結合の数を減らす) ために、注文と品目の間の双方向の関係にします。しかし、何らかの奇妙な理由でそれができない場合は、 Order からサブクエリを開始する必要があります...

LineItem lineItemAlias = null;
Product productAlias = null;

var subQuery = QueryOver.Of<Order>()
            .JoinAlias(x => x.LineItems, () => lineItemAlias)
            .JoinAlias(() => lineItemAlias.Product, () => productAlias)
            .Where(() => productAlias.Name == "foo")
            .Select(Projections.Group<Order>(x => x.Id));

var results = Session.QueryOver<Order>()
              .WithSubquery.WhereProperty(x => x.Id).In(subQuery)
              .List();
于 2013-01-02T21:22:50.527 に答える
2

あなたが提供したSQLの直接翻訳は、これを使用して達成できます

var subQuery = 
      QueryOver.Of<LineItem>(() => lineItem)
            .JoinAlias(() => lineItem.Products, () => product)
            .Where(() => product.Name == "foo")
            .Select(Projections.Distinct(
                      Projections.Property(()=> lineItem.Order.Id)));;

var theQueryYouNeed =  
               QueryOver.Of<Orders>(() => order)
              .WithSubquery.WherePropertyIn(() => order.Id).In(subQuery); 

ただし、LineItemエンティティにOrderプロパティがない場合、実際にはサブクエリを使用できません。

見つける必要がある場合

商品名が「foo」である LineItem を持つすべての注文

var theQueryYouNeed = 
  QueryOver.Of<Orders>(() => order)
     .JoinAlias(() => order.LineItems, () => lineItem)
     .JoinAlias(() => lineItem.Product, () => product)
     .Where(() => product.Name == "foo")
     .TransformUsing(new DistinctRootEntityResultTransformer())
于 2012-12-21T18:29:31.897 に答える