使用NHibernate QueryOver过滤和投影关联

时间:2011-09-01 12:21:42

标签: nhibernate queryover

假设您有一个类似于此的实体:

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看起来很不错,让我觉得我只需要显式添加投影/转换。

我一直在努力寻找一些相关的文档来帮助我,但似乎找不到任何解决此类查询的问题。有人可以暗示我吗?

2 个答案:

答案 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 ...”