【问题标题】:Nhibernate Criteria make dynamic query and get the row countNhibernate Criteria 进行动态查询并获取行数
【发布时间】:2011-04-19 07:12:28
【问题描述】:

我非常需要帮助。

我正在使用 Criteria 进行动态查询:

ICriteria query = session.CreateCriteria(typeof(Employee));

if (searchOptions.FirstName != null)
{
  query.Add(Expression.Eq("FirstName", searchOptions.FirstName));
}

if (!searchOptions.LastName != null)
{
  query.Add(Expression.Eq("LastName", searchOptions.LastName));
}

if (searchOptions.PhoneNumber != null)
{
  query.CreateCriteria("PhoneNumbers")
    .Add(Expression.Like("Number", searchOptions.PhoneNumber + "%"));
}

在此之后,我需要同时拥有总行数和分页。

分页:

query.SetFirstResult(0).SetMaxResults(8);

对于行数:

 query.SetProjection(Projections.RowCountInt64());

如何通过使用 MultiCriteria 或其他方式在单个查询中执行这两项操作。

请帮忙!

【问题讨论】:

    标签: c# nhibernate dynamic pagination


    【解决方案1】:

    你可以在nhibernate 2.0 Efficient Data Paging DataList Control and ObjectDataSource看到我的回答。

    再次编码:

        protected IList<T> GetByCriteria(
            ICriteria criteria, 
            int pageIndex,
            int pageSize, 
            out long totalCount)
        {
            ICriteria recordsCriteria = CriteriaTransformer.Clone(criteria);
    
            // Paging.
            recordsCriteria.SetFirstResult(pageIndex * pageSize);
            recordsCriteria.SetMaxResults(pageSize);
    
            // Count criteria.
            ICriteria countCriteria = CriteriaTransformer.TransformToRowCount(criteria);
    
            // Perform multi criteria to get both results and count in one trip to the database.
            IMultiCriteria multiCriteria = Session.CreateMultiCriteria();
            multiCriteria.Add(recordsCriteria);
            multiCriteria.Add(countCriteria);
            IList multiResult = multiCriteria.List();
    
            IList untypedRecords = multiResult[0] as IList;
            IList<T> records = new List<T>();
            if (untypedRecords != null)
            {
                foreach (T obj in untypedRecords)
                {
                    records.Add(obj);
                }
            }
            else
            {
                records = new List<T>();
            }
    
            totalCount = Convert.ToInt64(((IList)multiResult[1])[0]);
    
            return records;
        }
    

    它会复制您的原始条件两次:一个条件返回页面的记录,另一个条件返回总记录数。它还使用 IMultiCriteria 在一次往返中执行两个数据库调用。

    【讨论】:

    猜你喜欢
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    相关资源
    最近更新 更多