在NHibernate的QueryOver API中使用连接和投影实现排序和分页的问题

时间:2018-04-04 19:03:45

标签: c# nhibernate queryover

我仍然试图摆脱NHibernate的束缚。我对预测做了一些查询,到目前为止我设法得出了这个:

var restrictions = Restrictions.Conjunction();
// add some restrictions

var qo = Session.QueryOver(() => tenantAlias)
    .JoinAlias(x => x.Customer, () => customerAlias)
    .Where(restrictions)                
    .SelectList(list => list
        .Select(() => tenantAlias.Id).WithAlias(() => item.TenantId)
        .Select(() => tenantAlias.DomainName.Value).WithAlias(() => item.DomainName)
        .Select(() => customerAlias.Code.Value).WithAlias(() => item.CustomerCode)
        .Select(() => customerAlias.DisplayName).WithAlias(() => item.CustomerName)
        .Select(() => tenantAlias.ActivationPeriod.From).WithAlias(() => item.ActivationPeriodFrom)
        .Select(() => tenantAlias.ActivationPeriod.Until).WithAlias(() => item.ActivationPeriodUntil)
        .Select(() => tenantAlias.PurchasedLicenses.Value).WithAlias(() => item.PurchasedLicenses)
    )
    .TransformUsing(Transformers.AliasToBean<TenantQueryResult.Item>());

    var items = await qo.ListAsync<TenantQueryResult.Item>();

遵循DDD方法,Tenant是聚合根,Customer是实体,它们具有一对一的关系。到目前为止,这个查询工作得非常好。

但是,现在,我想按客户的displayname属性订购结果集。我发现有一个OrderBy方法,所以我认为添加以下行很简单:

.OrderBy(() => customerAlias.DisplayName)

但是,唉,这不会编译。原因是查询总是返回IQueryOver<T, T>的实例,但OrderBy子句仅返回IQueryOver<T>。并且IQueryOver<T>没有SelectListTransformUsing甚至ListAsync方法。所以我不知道OrderBy条款应该如何运作。 NHibernate文档[1]并没有提供一个例子,谷歌搜索只给我带了Cats的简单示例,但从来没有加入或转换或投影。

当我尝试向我的查询添加分页时,会发生同样的事情。 Take和Skip方法都可用,但它们有相同的问题,都返回IQueryOver<T>而不是IQueryOver<T, T>

问题是,当使用连接和投影时,我应该如何使用QueryOver API添加排序和分页子句?提前致谢。

[1] http://nhibernate.info/doc/nhibernate-reference/queryqueryover.html

1 个答案:

答案 0 :(得分:1)

我们必须添加方向ASC或DESC。所以不是这个

.OrderBy(() => customerAlias.DisplayName)
.TransformUsing(Transformers.AliasToBean<TenantQueryResult.Item>());

我们必须添加.Asc.Desc

.OrderBy(() => customerAlias.DisplayName)
    .Asc
.TransformUsing(Transformers.AliasToBean<TenantQueryResult.Item>());