Как выбрать количество (*) результатов подзапроса nHibernate? - PullRequest
8 голосов
/ 22 сентября 2008

Мне нужно сделать следующее для подкачки запроса в 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(*) не имеет смысла.

Ответы [ 6 ]

15 голосов
/ 20 января 2011

NHibernate 3.0 разрешает запрос Linq.

Попробуйте это

int count = session.QueryOver<Orders>().RowCount();
15 голосов
/ 23 сентября 2008
var session = GetSession();
var criteria = session.CreateCriteria(typeof(Order))
                    .Add(Restrictions.Eq("Product", product))
                    .SetProjection(Projections.CountDistinct("Price"));
return (int) criteria.UniqueResult();
2 голосов
/ 23 сентября 2008

Решил свой вопрос, изменив ответ Гейра-Тора .....

 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;
1 голос
/ 23 сентября 2008

Вот черновик того, как я это делаю:

Запрос:

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 голосов
/ 19 июля 2010

Я предпочитаю,

    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();
    }
0 голосов
/ 22 сентября 2008

Вам нужен e.Id, e.Name?

просто сделай

выберите количество (*) из объекта, где .....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...