1

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

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,因此一个情节有许多 PubDate。

我正在尝试使用 NHibernate Criteria API 编写一个查询,如果我有一个组 ID,它可以让我查询情节并按 PubDate 对其进行排序。

本质上,我如何为此 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

请帮忙!欢呼伙计们

4

1 回答 1

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,而不是使用严格的分离标准。

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

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

于 2011-01-11T03:35:54.797 回答