如何使用带有NHibernate的Criteria Api将子查询写为别名

时间:2011-01-07 06:54:30

标签: c# nhibernate subquery criteria-api

嘿伙计们,说我有这样的实体和映射:

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,因此一集的发布有很多PubDates。

我正在尝试使用NHibernate Criteria API编写一个查询,它允许我查询Episodes并按PubDate排序,因为我有一个Group Id。

基本上,如何为此SQL查询编写等效的Criteria API查询:

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

请帮忙!欢呼的家伙

1 个答案:

答案 0 :(得分: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))

作为一个特殊的考虑因素,您希望急切加载Group实体的原因是,如果您希望在业务逻辑中使用LINQ来比较PUBDATE,而不是使用严格的分离标准。< / p>

我们发现,通过急切加载实体的属性将减少对数据库的调用总数。

不保证此代码有效......但它至少应该让你开始,祝你好运:)