Linq for NHibernate,按可为空关联的属性排序

发布于 2024-11-09 08:49:02 字数 639 浏览 0 评论 0原文

请考虑这个简化的场景:

两个 NHibernate 实体:

public class Foo {
  public virtual Bar Bar {get; set;}
}

public class Bar {
  public virtual string Name {get; set;}
}

我需要按 Foo 的 Bar 名称对 Foo 集合进行排序。然而,并非所有 Foo 都分配了 Bar。对于某些实体,它是 null

显而易见:

Foos.OrderBy(f => f.Bar.Name)

抛出异常。

我能想到的处理它的唯一方法是向 Foo 添加一个可以在 OrderBy 子句中使用的公式。我有一种感觉,必须有一个更好、更优雅的解决方案。

有什么想法吗?

更新

此问题已在 NHibernate 3.1 中修复 - https://nhibernate.jira.com/browse/NH -2412

OrderBy 的外部连接是“内置的”

Kindly consider this simplified scenario:

Two NHibernate Entities:

public class Foo {
  public virtual Bar Bar {get; set;}
}

public class Bar {
  public virtual string Name {get; set;}
}

I need to sort a collection of Foo by their's Bar's name. however, not all Foos have Bars assigned. For some entities it is null

The obvious:

Foos.OrderBy(f => f.Bar.Name)

Throws an Exception.

The only way I can think of to handle it is to add a formula to Foo that I can use in the OrderBy clause. I have a feeling that there got to be a better and more elegant solution.

Any ideas?

Update

This issue is fixed in NHibernate 3.1 - https://nhibernate.jira.com/browse/NH-2412

The outer join for the OrderBy is "Built In"

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

丶情人眼里出诗心の 2024-11-16 08:49:02

需要指定与 Bar 的连接

如果您使用 NHibernate >=3.0,则

from foo in session.Query<Foo>()
join bar in session.Query<Bar>() on foo.Bar.Id equals bar.Id into leftJoinFooBar
from bars in leftJoinFooBar.DefaultIfEmpty()
orderby bars.Name
select foo

。如果您/正在使用 NHibernate <3.0。您必须使用 Criteria 或 HQL。

You need to specify a join to Bar

If you're using NHibernate >=3.0.

from foo in session.Query<Foo>()
join bar in session.Query<Bar>() on foo.Bar.Id equals bar.Id into leftJoinFooBar
from bars in leftJoinFooBar.DefaultIfEmpty()
orderby bars.Name
select foo

if you/re using NHibernate <3.0. You'll have to use Criteria or HQL.

我偏爱纯白色 2024-11-16 08:49:02

检查 Bar 是否为空,如果为空则选择默认字符串值,否则使用 Bar.name:

Foos.OrderBy(f => (f.Bar != null)?f.Bar.Name:"")

Check if Bar is null and pick a default string value if it is otherwise use Bar.name:

Foos.OrderBy(f => (f.Bar != null)?f.Bar.Name:"")
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文