假设您有一个类似于此的实体:
public class Mailinglist
{
public virtual Guid Id { get; set; }
public virtual ICollection<Subscriber> Subscribers { get; set; }
}
实体的NHibernate映射正如您所期望的那样:Id
是标识符,Subscribers
与<set>
映射,<many-to-many>
引用Subscriber
实体。
现在,我处于Mailinglist
实例的情况,需要获取与Subscriber
属性上的某些过滤器匹配的前100个订阅者列表。由于性能限制以及数据库中的数据量,myMailinglist.Subscribers.Where().Take()
不是一种选择。因此,我正在尝试将NHibernate的查询放在一起,它将从数据库中获取100个Subscriber
个实例。
我最初的尝试(没有任何过滤)是这样的:
var subscribers = session
.QueryOver<Mailinglist>()
.Where(m => m.Id == myMailinglistId)
.JoinQueryOver(m => m.Subscribers)
.Take(100)
.List();
这显然是不对的,因为我回来的列表包含对Mailinglist
的100个引用,这是我已经提到的。生成的SQL看起来很不错,让我觉得我只需要显式添加投影/转换。
我一直在努力寻找一些相关的文档来帮助我,但似乎找不到任何解决此类查询的问题。有人可以暗示我吗?
答案 0 :(得分:2)
var subquery = QueryOver.Of<Mailinglist>()
.Where(m => m.Id == myMailinglistId)
.JoinQueryOver(m => m.Subscribers, () => subscriber)
.Select(m => subscriber.Id);
var subscribers = session.QueryOver<Subscriber>()
.WithSubquery.WhereProperty(s => s.Id).In(subquery)
.Take(100)
.List();
答案 1 :(得分:0)
HQL不容易阅读吗?
没有经过测试,但有以下几点:
Query query =
session.createQuery("from Mailinglist m where m.subscriber = :code ")
.SetMaxResults(100)
.setParameter("code", "%john%");
List list = query.list();
setMaxResults应该转换为T-SQL“select top 100 ...”