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

时间:2008-09-22 17:15:47

标签: sql nhibernate subquery

为了在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。

关于所需语法的任何想法?

修改

Subquery使用distinct子句,我不能用Count(*)替换e.ID,e.Name,因为Count(*) distinct不是有效的语法,distinct count(*)没有意义。

6 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:15)

NHibernate 3.0允许Linq查询。

试试这个

int count = session.QueryOver<Orders>().RowCount();

答案 2 :(得分:2)

通过修改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;

答案 3 :(得分:1)

以下是我如何做的草稿:

查询:

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
}

答案 4 :(得分:0)

你需要e.Id,e.Name吗?

只是做

从Object中选择count(*).....

答案 5 :(得分:0)

我更喜欢,

    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();
    }