Linq for NHibernate,由可空连接的属性排序

时间:2011-05-25 13:56:32

标签: nhibernate linq-to-nhibernate

请考虑这个简化的场景:

两个NHibernate实体:

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

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

我需要用他们的Bar的名字来排序Foo的集合。然而,并非所有Foos都有指定的条形图。对于某些实体,它为null

显而易见:

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

引发例外。

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

有什么想法吗?

更新

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

中修复

OrderBy的外部联接是“内置”

2 个答案:

答案 0 :(得分:2)

您需要指定一个连接到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&lt; 3.0。您必须使用Criteria或HQL。

答案 1 :(得分:0)

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

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