我仍然试图摆脱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>
没有SelectList
或TransformUsing
甚至ListAsync
方法。所以我不知道OrderBy
条款应该如何运作。 NHibernate文档[1]并没有提供一个例子,谷歌搜索只给我带了Cats的简单示例,但从来没有加入或转换或投影。
当我尝试向我的查询添加分页时,会发生同样的事情。 Take和Skip方法都可用,但它们有相同的问题,都返回IQueryOver<T>
而不是IQueryOver<T, T>
。
问题是,当使用连接和投影时,我应该如何使用QueryOver API添加排序和分页子句?提前致谢。
[1] http://nhibernate.info/doc/nhibernate-reference/queryqueryover.html
答案 0 :(得分:1)
我们必须添加方向ASC或DESC。所以不是这个
.OrderBy(() => customerAlias.DisplayName)
.TransformUsing(Transformers.AliasToBean<TenantQueryResult.Item>());
我们必须添加.Asc
或.Desc
.OrderBy(() => customerAlias.DisplayName)
.Asc
.TransformUsing(Transformers.AliasToBean<TenantQueryResult.Item>());