我有这种方法来获取分页和过滤的数据:
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,我有两种情况:
点击(加载默认值)之前 - 首次加载页面: (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)
点击列&#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)
请注意,唯一不同的是添加&#34; 和( lower(documento1_.numero)喜欢&#39; %%&#39; )&#34;部分。发生这种情况是因为此列既可排序又可搜索。 我怎么能说NHibernate在这个列中搜索但忽略null呢? 我想这可以解决我的问题。
答案 0 :(得分:0)
自己找到解决方案
在行中添加了额外的支票:
if (dataColumn.Searchable)
添加了:
if (dataColumn.Searchable && !string.IsNullOrWhiteSpace(search))
好吧,我发现当搜索为空时问题就出现了。