[英]Fluent NHibernate QueryOver: avoid orderby null reference table
我正在使用Fluent NHibernate映射一个相当简单的数据库。 我遇到以下情况的问题。 假设我的班级看起来像这样
ClassA
-------
...
string A_Name;
ClassB InnerObject; <- can be 'null' in the code,
because not every A record has a matching B record
ClassB
-------
...
string B_Name;
我正在使用JQuery数据表,在其中按记录显示/显示A_Name
和InnerObject.B_Name
。 所有这些仅用于访问数据。 我可以手动测试InnerObject
是否为null
,如果是,则仅显示一个空字符串值。 这有效并且很好。
我遇到的问题是如何使用正确的语法对该列进行排序。 根据用户要排序的列,我有类似以下内容:
if (sort on innerObject's B_Name)
{
query.OrderBy(() => innerObjectAlias.B_Name).Asc();
}
我相当确定我的映射设置正确,并且这里的问题是,如果innerObject
为null
,那么我需要能够“跳过”排序(或修改)。
因此,这样的事情会很好,但显然不起作用(因为我认为Fluent NHibernate从未真正为别名分配值吗?):
if (sort on innerObject's B_Name AND innerObjectAlias != null)
{
query.OrderBy(() => innerObjectAlias.B_Name).Asc();
}
任何帮助将不胜感激。
此可空性检查是可能的。 但这不是在添加订单的地方( ORDER BY
)。 在创建关联 ( JOIN
)的那一刻必须修复它。 代替这个:
// instead of this
// resulting in INNER JOIN
query.JoinAlias(root => root.InnerObject, () => innerObjectAlias);
// we must use this
query.JoinAlias(root => root.InnerObject, () => innerObjectAlias
, JoinType.LeftOuterJoin);
// which will result in LEFT OUTER JOIN
然后,即使该语句也将返回正确的行,部分按现有列排序
query
.OrderBy(() => innerObjectAlias.B_Name)
.Asc
...
注意:如果要驱动NULL行的放置,我们可以通过一些投影进行排序,像这里提到的那样做魔术
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.