流畅的NHibernate查询:连接表的OrderBy列

时间:2014-07-25 12:47:26

标签: c# pagination fluent-nhibernate sql-order-by queryover

我现在一直在努力尝试用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();

非常感谢!

2 个答案:

答案 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));