我现在一直在努力尝试用NHibernate查询一些东西。 我设法做了一些非常简单的查询,但现在我试图通过NHibernate构建一些自定义分页。
我想做的是双重的。 第一个(1)关闭,我希望能够根据联接表中的列来订购我的结果集。 我们假设我有一个“人物”。具有一对一(实际上是多对一)引用的表,其中包含'地址'表。 我想查询“人物”。表(使用其字段),但希望使用'地址'中的字段进行排序。表
我该怎么做?我尝试了以下两种方式
var resultset = GetCurrentSession().QueryOver<Person>()
.Where(x => x.Name == "...")
.JoinQueryOver<Address>(x => x.Address)
.OrderBy(x => x.HouseNumber).Desc
.Skip(...)
.Take(...)
.List();
// ==> could not execute query
Person person = null;
Address address = null;
var resultset = GetCurrentSession().QueryOver<Person>()
.JoinAlias(() => person, () => address.Persons)
.Where(() => person.Name == "...")
.OrderBy(() => address.HouseNumber).Asc
.Skip(...)
.Take(...)
.List();
// ==> could not resolve property: person of: Person
我的第二(2)问题是,我想将订单分开。 基于条件语句,我想添加一个不同的OrderBy。 我可以这样做吗?
var query = GetCurrentSession().QueryOver<Person>()
.Where(x => x.Name == "...")
.JoinQueryOver<Address>(x => x.Address);
if(foo)
{
query = query.OrderBy(() => address.HouseNumber).Asc
}
else if (bar)
{
query = query.OrderBy(() => address.Street).Desc
}
var resultset = query
.Skip(...)
.Take(...)
.List();
非常感谢!
答案 0 :(得分:4)
所有 的示例都应该工作,需要为了使用它们而正确分配别名所需的小警告(消息无法解析属性:person of:Person < / em>表示person
从未实际设置为别名)。例如:
Person person = null;
Address address = null;
// Assign the person alias using () => person
var resultset = GetCurrentSession().QueryOver<Person>(() => person)
.JoinAlias(() => person.Address, () => address) // Assign the address alias here
.Where(() => person.Name == "...")
.OrderBy(() => address.HouseNumber).Asc
.Skip(...)
.Take(...)
.List();
这应该可以正常工作。
至于你的第二个问题,你想要实现的是非常可能的,实际上是使用QueryOver开始的一个很好的理由。你只需要做一些调整:
var query = GetCurrentSession().QueryOver<Person>()
.Where(x => x.Name == "...")
.JoinQueryOver<Address>(x => x.Address, () => address); // assign address alias
if(foo)
{
query.OrderBy(() => address.HouseNumber).Asc(); // <-- use the *method* .Asc()
}
else if (bar)
{
query.OrderBy(() => address.Street).Desc(); // <-- use the *method* .Desc()
}
请注意,由于.Asc()
和.Desc()
实际上会修改查询,因此您无需重新分配查询。请务必使用方法 .Asc()
和.Desc()
,这样您就不会遇到构建错误。
答案 1 :(得分:0)
这里是动态排序
string orderColumn = "";
bool isAsc = (param.sSortDir_0 == "asc");
switch (param.iSortCol_0)
{
case 1: orderColumn = "Approved"; break;
case 2: orderColumn = "CreateDate"; break;
case 3: orderColumn = "Rate"; break;
}
result.UnderlyingCriteria.AddOrder(new NHibernate.Criterion.Order(orderColumn, isAsc));