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
请帮忙!欢呼的家伙
答案 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>
我们发现,通过急切加载实体的属性将减少对数据库的调用总数。
不保证此代码有效......但它至少应该让你开始,祝你好运:)