2011-01-07 66 views
1

嗨,說我有實體和映射這樣的:如何編寫使用條件查詢API子查詢的別名與NHibernate

public class Episode 
{ 
    Guid Id {get;set;} 
    String Title {get;set;} 
    List<Group> Groups {get;set;} 
} 

public class Group 
{ 
    Guid Id {get;set;} 
    DateTime PubDate {get;set;} 
} 

public class EpisodeMap : ClassMap<Episode> 
{ 
    public EpisodeMap() 
    { 
     //other mappings.. 
     Map.HasMany(ep => ep.Groups); 
    } 
} 

所以,基本上,一個小插曲有許多組。每個組都有一個PubDate,所以一個Episode有許多PubDate。

我想寫使用NHibernate的標準API,它讓我查詢情節和pubdate的給予,我有一個組ID順序它們的查詢。

從本質上講,我怎麼寫相當於標準API查詢此SQL查詢:

Select 
    e.*, 
    (Select top 1 ReleaseDate From EpisodeGroups where EpisodeFk = e.Id and GroupFk = @GroupId) as myPubDate 
From Episodes e 
Order By myPubDate 

請幫幫忙!歡呼傢伙

回答

3
public DetachedCriteria BuildCriteria(int episodeId, int groupId) 
{ 

    var groupCriteria = DetachedCriteria.For<Groups>() 
     .Add(Restrictions.Eq("this.Id", groupId)) 
     .Add(Restrictions.Eq("Group.Id", groupId)) 
     .AddOrder(Order.Asc("Group.PubDate")); 

    return DetachedCriteria.For<EpisodeGroups>() 
       .Add(Restrictions.Eq("this.Id", episodeId)) 
       .Add(Subqueries.PropertyIn("this.Groups", groupCriteria) 
       .SetMaxResult(1); 
} 

然後,你可以做這樣的事情......

var episodes = _repository.ExectueCriteria<EpisodeGroups>(BuildCriteria(episodeId, groupId)) 

正如一個特殊的考慮,你爲什麼會想急切地加載組實體的原因是如果你想使用LINQ來稍後比較業務邏輯​​中的PUBDATE,而不是使用嚴格的分離條件。

我們已經發現,通過急切地加載一個實體的屬性將減少調用到我們的數據庫的總數。

不保證此代碼的工作...但它至少應該讓你開始,祝你好運:)

+0

+ 1哎timbob,非常感謝。我一直在使用Criteria API,我發現它非常不直觀!我會試一試,讓你知道我該怎麼走,謝謝你的好解釋 – andy 2011-01-11 06:55:24