繁体   English   中英

流利的NHibernate QueryOver:避免使用orderby空引用表

[英]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_NameInnerObject.B_Name 所有这些仅用于访问数据。 我可以手动测试InnerObject是否为null ,如果是,则仅显示一个空字符串值。 这有效并且很好。

我遇到的问题是如何使用正确的语法对该列进行排序。 根据用户要排序的列,我有类似以下内容:

    if (sort on innerObject's B_Name)
    {
        query.OrderBy(() => innerObjectAlias.B_Name).Asc();
    }

我相当确定我的映射设置正确,并且这里的问题是,如果innerObjectnull ,那么我需要能够“跳过”排序(或修改)。

因此,这样的事情会很好,但显然不起作用(因为我认为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM