2008-09-22 72 views
8

的COUNT(*)我需要做寻呼NHibernate的查询的用途如下:如何选择一个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。

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

编辑

子查询使用不同的条款,我不能因为Count(*)Count(*) distinct不是一个有效的语法替换e.ID,e.Name和distinct count(*)是没有意义的。

+0

看来,我们需要看到的应用程序/ C#代码调用返回后 – 2008-09-22 17:57:33

回答

0

您是否需要e.Id,e.Name?

只是做的对象,其中

SELECT COUNT(*)......

+0

对不起,我忘了补充规定,该子查询是不同的。 – ForCripeSake 2008-09-22 17:42:33

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 
} 
+0

该问题源于这样一个事实,即我需要第一个查询的不同结果的Count(*),因为查询中的count(*)不会生成相同的数字(3个结果与54个结果由于多个联接而产生)。 ) – ForCripeSake 2008-09-22 20:33:09

+0

啊,对。对不起,我错过了 – 2008-09-23 01:26:01

2

通过修改吉尔 - 托雷的回答解决了我自己的问题.....

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; 
14
var session = GetSession(); 
var criteria = session.CreateCriteria(typeof(Order)) 
        .Add(Restrictions.Eq("Product", product)) 
        .SetProjection(Projections.CountDistinct("Price")); 
return (int) criteria.UniqueResult(); 
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(); 
    } 
14

NHibernate的3.0允许Linq查询。

试试这个

int count = session.QueryOver<Orders>().RowCount(); 
相关问题