2013-03-24 5 views
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.

+0

Было бы * * более полезно, если вы могли бы простой английский язык определение того, что вы хотите запросить вместо описания QueryOver запрос. – frictionlesspulley

+0

Oke Я попытался больше сосредоточиться на конкретном вопросе. Надеюсь, теперь моя проблема стала яснее. – core

+0

Если бы вы могли указать пример того, что пытается выполнить запрос, это, безусловно, поможет. – frictionlesspulley

ответ

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))); 

FYI: Обратите внимание, что это может быть не самый идеальный способ обработки вашего запроса. Я всегда сжимаю, когда смотрю на использование IN() и подзапросов.

Если цепь не имеет магазин в нем тогда // 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))); 
+0

После нескольких испытаний у меня есть решение. Я опубликую его отдельно. Спасибо за толкание в правильном направлении! – core

 Смежные вопросы

  • Нет связанных вопросов^_^