2008-09-22 7 views
8

мне нужно сделать следующее для целей поискового вызова запроса в NHibernate:Как выбрать Count (*) результатов не давал 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.

Любые идеи относительно требуемого синтаксиса?

EDIT

Подзапрос использует отдельную статью, я не могу заменить e.ID, e.Name с Count(*), потому что Count(*) distinct не является допустимым синтаксисом, и 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

проблема связана с тем, что мне нужен граф (*) отдельных результатов первого запроса, так как счетчик (*) в запросе не производит одинаковое число (3 результата по сравнению с 54 результатами из-за нескольких объединений.) – ForCripeSake 2008-09-22 20:33:09

+0

А, справа. Извините, я пропустил это – 2008-09-23 01:26:01

2

решаемые Мой собственный вопрос, изменив Geir-Торе ответ .....

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