1

これが私のドメイン モデルの小さな抜粋です。

public class Chain
{
    public IList<Product> Products { get; set; }
}

public class Store
{
    public Chain Chain { get; set; }
    public IList<Product> Products { get; set; }
}

Productここで、Store および関連する でクエリを作成する必要がありますChain。問題は、所有物に保管されている製品のクエリをどのように拡張できるChainかです。

これが私がこれまでに持っているものです:

var subQuery = QueryOver.Of<Store>()
    .Where(s => s.Id == searchCriteria.StoreId)
    .Select(s => s.Id);

Store storeAlias = null;
var query = _session.QueryOver<Product>()
    .JoinAlias(p => p.Stores, () => storeAlias)
    .WithSubquery.WhereProperty(() => storeAlias.Id).In(subQuery);
    //// some more clauses...

これどうやってするの?注意:Chainのプロパティは であるStore可能性がありますnull

4

1 に答える 1

1

私はこれがうまくいくと信じています。ローカル データベースでは試していませんが、正しい方向に導く必要があります。

Product product = null;
Store store = null;
Chain chain = null;

//01. Load Products from Store

var productsFromStores 
     = QueryOver.Of(() => product)
             .JoinAlias(() => product.Stores, () => store)
             .Where(() => store.Id == searchCriteria.StoreId)
             .Select(Projections.Distinct(Projections.Id()));

//02.  If Chain DOES NOT refer Store 
  var productFromChains 
         = QueryOver.Of(() => store)
             .JoinAlias(() => store.Chain, () => chain)
             .JoinAlias(() => chain.Products, () => product)
             .Where(() => store.Id == StoreId)
             .Select(Projections.Distinct(
                     Projections.Property(() => product.Id)));

//03. Load Products from present either in the Store and or the chains
var products 
     = session.QueryOver(() => product)
       .Where(
             Restrictions.Or(
             Subqueries.WhereProperty(() => product.Id)
                                     .In(productsFromStores),
             Subqueries.WhereProperty(() => product.Id)
                                     .In(productFromChains)));

参考までに: これは、クエリを処理する最も理想的な方法ではない可能性があることに注意してください。IN ()の使用とサブクエリを見ると、いつもうんざりします。

Chain DOES に Store がある場合、//02 は次のように記述できます。

//Load Products from Chains
//02.  If Chain DOES refer to a Store 
  var productFromChains 
         = QueryOver.Of(() => chain)
              .JoinAlias(() => chain.Store, () => store)
              .JoinAlias(() => chain.Products, () => product)
              .Where(() => store.Id == searchCriteria.StoreId)
              .Select(Projections.Distinct(
                           Projections.Property(() => product.Id)));
于 2013-04-08T19:26:54.500 に答える