C# Nhibernate条件进行动态查询并获取行数

C# Nhibernate条件进行动态查询并获取行数,c#,nhibernate,dynamic,pagination,C#,Nhibernate,Dynamic,Pagination,我非常需要帮助 我正在使用条件进行动态查询: ICriteria query = session.CreateCriteria(typeof(Employee)); if (searchOptions.FirstName != null) { query.Add(Expression.Eq("FirstName", searchOptions.FirstName)); } if (!searchOptions.LastName != null) { query.Add(Express

我非常需要帮助

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

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());
如何使用多标准或其他方法在单个查询中同时执行这两个查询

请帮忙

你可以从中看到我的答案

再次编码:

    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;
    }
受保护的IList GetByCriteria(
ICriteria标准,
int pageIndex,
int pageSize,
外长总计数)
{
ICriteria recordsCriteria=CriteriaTransformer.Clone(标准);
//寻呼。
recordsCriteria.SetFirstResult(页面索引*页面大小);
recordsCriteria.SetMaxResults(页面大小);
//计数标准。
ICriteria countCriteria=CriteriaTransformer.TransformToRowCount(标准);
//执行多个条件以在数据库的一次访问中获得结果和计数。
IMultiCriteria multiCriteria=Session.CreateMultiCriteria();
多标准。添加(记录标准);
多标准。添加(计数标准);
IList multiResult=multiCriteria.List();
IList untypedRecords=作为IList的多结果[0];
IList记录=新列表();
if(非类型记录!=null)
{
foreach(非类型记录中的对象)
{
记录。添加(obj);
}
}
其他的
{
记录=新列表();
}
totalCount=Convert.ToInt64(((IList)multiResult[1])[0]);
退货记录;
}
它会将原始条件克隆两次:一个条件返回页面的记录,另一个条件返回总记录数。它还使用IMultiCriteria在一次往返中执行两个数据库调用。

您可以在中看到我的答案

再次编码:

    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;
    }
受保护的IList GetByCriteria(
ICriteria标准,
int pageIndex,
int pageSize,
外长总计数)
{
ICriteria recordsCriteria=CriteriaTransformer.Clone(标准);
//寻呼。
recordsCriteria.SetFirstResult(页面索引*页面大小);
recordsCriteria.SetMaxResults(页面大小);
//计数标准。
ICriteria countCriteria=CriteriaTransformer.TransformToRowCount(标准);
//执行多个条件以在数据库的一次访问中获得结果和计数。
IMultiCriteria multiCriteria=Session.CreateMultiCriteria();
多标准。添加(记录标准);
多标准。添加(计数标准);
IList multiResult=multiCriteria.List();
IList untypedRecords=作为IList的多结果[0];
IList记录=新列表();
if(非类型记录!=null)
{
foreach(非类型记录中的对象)
{
记录。添加(obj);
}
}
其他的
{
记录=新列表();
}
totalCount=Convert.ToInt64(((IList)multiResult[1])[0]);
退货记录;
}

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

您测试过它的性能吗?它真的改善了吗?改善了多少?我会回答我自己的问题。简单的回答是,根据ayende的说法,这一比例约为25%-30%。你有没有测试过它的性能?它真的改善了吗?改善了多少?我会回答我自己的问题。简单的回答是,根据ayende的说法,这一比例约为25%-30%。看见