NHibernate的Linq,按可空关联的属性排序 请考虑这个简化的场景:
两个NHibernate实体: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) 抛出异常 我能想到的处理它的唯一方
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不需要任何连接就可以工作了。外部连接是“内置”的。不过,我会接受这个答案,因为它确实让我更接近答案。