为了在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(*)
没有意义。
答案 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();
}