NHibernate的Linq,按可空关联的属性排序 请考虑这个简化的场景:

NHibernate的Linq,按可空关联的属性排序 请考虑这个简化的场景:,nhibernate,linq-to-nhibernate,Nhibernate,Linq To Nhibernate,两个NHibernate实体: public class Foo { public virtual Bar Bar {get; set;} } public class Bar { public virtual string Name {get; set;} } 我需要按他们酒吧的名字对一批Foo进行分类。但是,并非所有的FOO都指定了条形图。对于某些实体,它是空的 显而易见的是: Foos.OrderBy(f => f.Bar.Name) 抛出异常 我能想到的处理它的唯一方

两个NHibernate实体:

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

public class Bar {
  public virtual string Name {get; set;}
}
我需要按他们酒吧的名字对一批Foo进行分类。但是,并非所有的FOO都指定了条形图。对于某些实体,它是空的

显而易见的是:

Foos.OrderBy(f => f.Bar.Name)
抛出异常

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

有什么想法吗

更新 该问题在NHibernate 3.1-


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

检查Bar是否为空,如果为空,则选择默认字符串值。名称:

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

您需要指定一个连接到工具栏的连接

如果您使用的是NHibernate>=3.0

session.Query()中来自foo的
)
将foo.bar.Id上的session.Query()中的bar等于bar.Id连接到leftJoinFooBar中
来自leftJoinFooBar.DefaultIfEmpty()中的条
orderby条。名称
选择foo

如果出于好奇而使用NHibernate,会引发什么异常?有相同的问题。我只是确保每个foo都有自己的酒吧,尽管这个名字可能是空的。但这是一个解决方法…我已经尝试了一些方法,现在,在添加.Fetch(f=>f.Bar)之后,我可以进行排序,现在的问题是返回的结果只有带有Bar值的结果。我怀疑NHibernate Linq提供程序是否可以解析出它:/NH Linq提供程序确实不支持这一点。。。看起来很有趣。我明天会查出来的。我没用。获取了NHibernate异常-操作不受支持。是否使用NHibernation 3.x?听起来您可能必须使用QueryOver、Criteria或HQL。linq提供程序没有前面提到的3种方法那么强大。显然这是在3.1中修复的(我当时在3.0上)()实际上现在OrderBy不需要任何连接就可以工作了。外部连接是“内置”的。不过,我会接受这个答案,因为它确实让我更接近答案。