2013-03-24 57 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; } 
} 

现在我需要在Store相关Chain创造了Product查询。 问题是如何扩展存储在所有者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 2013-04-07 15:51:13

+0

奥克我试图把重点放在更具体的问题上。我希望我的问题现在变得更加清晰。 – core 2013-04-08 18:15:19

+0

如果您可以指定查询尝试执行的示例,那肯定会有所帮助。 – frictionlesspulley 2013-04-08 18:24:51

回答

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()和子查询时,我总是畏缩。

如果链确实有一个商店在其随后// 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 2013-04-10 19:25:06