NHibernate没有按可空的子属性排序

时间:2014-12-02 11:52:01

标签: c# nhibernate

我有这种方法来获取分页和过滤的数据:

public IList<T> GetFiltered(int startIndex, int rowCount, Expression<Func<T, bool>> where,
        Dictionary<Expression<Func<T, object>>, object> like, List<DataColumn> dataColumns, string search,
        out int count)
    {
        IList<T> result = null;

        using (ITransaction transaction = this._session.BeginTransaction())
        {
            _session.DisableFilter("ActiveVersionFilter");
            _session.DisableFilter("AtivoFilter");

            ICriteria criteria = this._session.CreateCriteria<T>();

            //Add filters...
            criteria.Add(Restrictions.Where(where));

            //Add sorting and Likes
            Junction disjunction = Restrictions.Disjunction();
            foreach (var dataColumn in dataColumns)
            {
                if (dataColumn.Name.Contains("."))
                {
                    var alias = dataColumn.Name.Split('.').First();
                    criteria.CreateCriteria(alias, alias, JoinType.LeftOuterJoin);
                }

                if (dataColumn.Searchable)
                {
                    ICriterion criterion = Restrictions.InsensitiveLike(dataColumn.Name, search, MatchMode.Anywhere);
                    disjunction.Add(criterion);
                }

                if (dataColumn.IsOrdered)
                    criteria.AddOrder(new Order(dataColumn.Name, dataColumn.Ascending));
            }

            //Add likes..
            if (!disjunction.ToString().Equals("()")) criteria.Add(disjunction);

            //clone to count
            var resultCriteria = (ICriteria) criteria.Clone();

            //Add paging...
            resultCriteria.SetFirstResult(startIndex).SetMaxResults(rowCount);

            result = resultCriteria.List<T>();
            count = criteria.SetProjection(Projections.RowCount()).FutureValue<int>().Value;

            transaction.Commit();
        }

        return result;
    }

我的问题是&#34;添加排序和喜欢&#34;部分。我传递了一个&#34; DataColumn&#34;具有已排序和可搜索列的对象(我使用jQuery DataTables插件)。 一些可排序的列是子属性,因此我将别名和列名称设置为点(即&#34; documento.numero&#34;)并拆分以仅获取别名以添加条件(左连接)。 / p>

当我按照这个列排序时会出现问题&#34; documento.numero&#34;和&#34;文件&#34;一片空白。 &#34;左连接&#34;似乎没有工作,只返回带有有效&#34; documento&#34;。

的条目

我做错了吗?我是否需要提供更多详细信息?

谢谢!

更新

对于生成的SQL,我有两种情况:

  1. 点击(加载默认值)之前 - 首次加载页面: (PS:我只是复制了WHERE和ORDERBY部分)

    WHERE         (             (                 (                     this_.status = 1                     和(                         1 = 1                         或this_.locIid = 1                     )                 )                 和this_.ativo =&#39; T&#39;             )             和this_.activeVersion = 0         )     订购         this_.criacao asc,         documento1_.numero asc)

  2. 点击列&#34; documento.numero&#34;:

    WHERE         (             (                 (                     this_.status = 1                     和(                         1 = 1                         或this_.locIid = 1                     )                 )                 和this_.ativo =&#39; T&#39;             )             和this_.activeVersion = 0         )         和(             lower(documento1_.numero)喜欢&#39; %%&#39;         )     订购         this_.criacao asc,         documento1_.numero asc)

  3. 请注意,唯一不同的是添加&#34; 和(                 lower(documento1_.numero)喜欢&#39; %%&#39;             )&#34;部分。发生这种情况是因为此列既可排序又可搜索。 我怎么能说NHibernate在这个列中搜索但忽略null呢? 我想这可以解决我的问题。

1 个答案:

答案 0 :(得分:0)

自己找到解决方案

在行中添加了额外的支票:

if (dataColumn.Searchable)

添加了:

if (dataColumn.Searchable && !string.IsNullOrWhiteSpace(search))

好吧,我发现当搜索为空时问题就出现了。