c# - 流畅的 NHibernate 查询 : OrderBy column of joined table

标签 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();

非常感谢!

最佳答案

您的所有示例应该 都可以工作,但需要注意的是您需要正确分配别名才能使用它们(消息无法解析属性:人的:人 表示 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(),以免出现构建错误。

关于c# - 流畅的 NHibernate 查询 : OrderBy column of joined table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24956171/

相关文章:

c# - 如何在 ASP.NET MVC 中获取 ViewBag 值?

c# - 如何添加自定义后应用的通用后处理

extjs - 为网格制作良好的分页 - extJS

ruby-on-rails - 使用 Elasticsearch、Tire 和 Kaminari 进行分页

c# - 使用 Fluent Nhibernate Table-Per-Subclass 策略时可以指定身份列吗?

c# - 当子类的对象作为父类(super class)调用时,子类中重写的方法是否仍然被调用?

c# - '='字符,十六进制值0x3D,不能包含在名称中

javascript - 我怎样才能实现这个twbs分页

c# - 这是最流畅的 nhibernate 抓取策略吗?

c# - 有没有办法使用 NHibernate 强制执行最小字符串长度?