2011-01-07 72 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