如何选择nHibernate子查询结果的Count(*)

时间:2020-03-06 14:33:07  来源:igfitidea点击:

为了在nHibernate中分页查询,我需要执行以下操作:

Select count(*) from 
(Select e.ID,e.Name from Object as e where...)

我尝试了以下方法,

select count(*) from Object e where e = (Select distinct e.ID,e.Name from ...)

我得到一个nHibernate异常,说我不能将Object转换为int32.

对所需语法有任何想法吗?

编辑

子查询使用了distinct子句,我无法用" Count()"替换e.ID,e.Name,因为" Count()distant"不是有效的语法,而" distinct count(*)"则毫无意义。

解决方案

我们是否需要e.Id,e.Name?

做就是了

从对象的位置选择count(*)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

这是我如何做的草稿:

询问:

public IList GetOrders(int pageindex, int pagesize)
{
    IList results = session.CreateMultiQuery()
        .Add(session.CreateQuery("from Orders o").SetFirstResult(pageindex).SetMaxResults(pagesize))
        .Add(session.CreateQuery("select count(*) from Orders o"))
        .List();
    return results;
}

ObjectDataSource:

[DataObjectMethod(DataObjectMethodType.Select)]
public DataTable GetOrders(int startRowIndex, int maximumRows)
{
    IList result = dao.GetOrders(startRowIndex, maximumRows);
    _count = Convert.ToInt32(((IList)result[1])[0]);

    return DataTableFromIList((IList)result[0]); //Basically creates a DataTable from the IList of Orders
}

通过修改Geir-Tore的答案解决了我自己的问题。

IList results = session.CreateMultiQuery()
        .Add(session.CreateQuery("from Orders o").SetFirstResult(pageindex).SetMaxResults(pagesize))
        .Add(session.CreateQuery("select count(distinct e.Id) from Orders o where..."))
        .List();
    return results;

var session = GetSession();
var criteria = session.CreateCriteria(typeof(Order))
                    .Add(Restrictions.Eq("Product", product))
                    .SetProjection(Projections.CountDistinct("Price"));
return (int) criteria.UniqueResult();

我更喜欢,

public IList GetOrders(int pageindex, int pagesize, out int total)
    {
            var results = session.CreateQuery().Add(session.CreateQuery("from Orders o").SetFirstResult(pageindex).SetMaxResults(pagesize));

            var wCriteriaCount = (ICriteria)results.Clone());

            wCriteriaCount.SetProjection(Projections.RowCount());

            total = Convert.ToInt32(wCriteriaCount.UniqueResult());

            return results.List();
    }