gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:18:59 24 4
gpt4 key购买 nike

我一直在努力尝试使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com