2012-10-05 113 views
1

我想檢索一個根集合及其子集,在子集合上應用日期篩選器。流利的NHibernate篩選子集合Linq

CREATE TABLE Shop 
(
    Id int 
) 

CREATE TABLE Order 
(
    ShopId int, 
    OrderDate datetime 
) 

當然,子對象不具有ShopId財產,以避免雙向參考:

class Shop 
{ 
    int Id { get; set; } 
    List<Order> { get; set; } 
} 

class Order 
{ 
    DateTime OrderDate { get; set; } 
} 

而且FNHB映射是這樣的:

public ShopMap() 
{ 
    this.Table("SHOP"); 
    this.Id(x => x.Id).Column("ID"); 
    this.HasMany(x => x.Orders).Table("ORDER").KeyColumn("SHOP_ID"); 
} 

public OrderMap() 
{ 
    this.Table("ORDER"); 
    this.Map(x => x.OrderDate); 
} 

我試圖檢索一個給定的商店與其訂單之間的某些日期,給定參數shopId, fromDate, toDate,我試過這個,但它會拋出異常:

Session.Query<Shop>().Where(shop => shop.Id == shopId) 
.FetchMany(
    shop => shop.Orders.Where(
     order => order .OrderDate >= fromDate && order.OrderDate <= toDate)); 

這可以在不使用Magic Strings(NHb標準,HQL等)的情況下實現,這可以通過簡單的Linq查詢來實現嗎?

+0

如果可以接受的話,可以使用QueryOver完成。 – Phill

回答

3

您需要有條件地出現在聯接的ON子句,而對於shopId檢查應在WHERE子句。試試這個:

Shop shopAlias = null; 
Order orderAlias = null; 

ICriterion dateCriterion = Restrictions.Where<Order> 
    (o => o.OrderDate >= fromDate && o.OrderDate <= toDate); 

var query = 
    QueryOver.Of(() => shopAlias).Left.JoinAlias(
    () => shopAlias.Orders,() => orderAlias, dateCriterion).Where 
    (s => s.Id == shopId); 
var result = query.GetExecutableQueryOver(Session).SingleOrDefault(); 
0

不能弄明白使用查詢,但可以使用QueryOver做到這一點:

Shop shopAlias = null; 
var existing = QueryOver.Of<Order>() 
         .Where(x => x.OrderDate >= fromDate) 
         .And(x => x.OrderDate <= toDate) 
         .And(x => x.Shop.Id == shopAlias.Id) 
         .Select(x => x.Shop); 

result = Session.QueryOver<Shop>(() => shopAlias) 
       .Fetch(x => x.Orders).Eager 
       .WithSubquery.WhereNotExists(existing) 
       .List(); 

類似的東西應該工作。

http://www.philliphaydon.com/2011/01/revisiting-exists-in-nhibernate-3-0-and-queryover/

+0

謝謝,但是這對我來說不起作用,因爲Order對象沒有Shop屬性。 – Tsar

+0

它有ShopId嗎?如果您正在映射一個方向,爲什麼不映射另一個方向,爲了不直接分配ID,您必須指定商店實例。 – Phill

+0

你在做第二個查詢?它看起來像尋找除了我真正需要的商店之外的所有商店... _I'm試圖找回指定商店,並在特定日期之間放置訂單_ – Tsar