NHibernate. get singleOrDefault - PullRequest
       1

NHibernate. get singleOrDefault

1 голос
/ 21 июня 2010

У меня есть следующий метод.Это возвращает единственный незаполненный заказ.Однако я просто хочу первый результат.Каков наилучший способ достичь этого.Конечно, я мог бы вернуть список, а затем получить первый результат из этого.

то есть .List<Order>().SingleOrDefault();

Конечно, есть критерии API, чтобы достичь этого?

Ответы [ 2 ]

7 голосов
/ 21 июня 2010

Это немного менее сложно, чем предложила Сен-Жербиль:

Model.Order order = _session
        .CreateCriteria<Model.Order>()
        .Add(Restrictions.Eq("UserName", user.UserName))
        .Add(Restrictions.Eq("CompanyId", companyId))
        .Add(Restrictions.Eq("OrderStatus", OrderStatusHelper.OrderOpen()))
        .AddOrder(sortOrder)
        .SetMaxResults(1)
        .UniqueResult<Model.Order>();

Это выполнит запрос с использованием синтаксиса БД для получения только одной записи.

Если нет записей, соответствующих критериям, UniqueResult возвращает ноль.

Вы также можете использовать NHibernate Linq (либо провайдер 2.x contrib, либо интегрированный в NH 3.x). В этом случае вы должны использовать FirstOrDefault вместо SingleOrDefault для достижения желаемого результата.

1 голос
/ 21 июня 2010
    IList<Model.Order> order = _session
        .CreateCriteria(typeof(Model.Order))
        .Add(Restrictions.Eq("UserName", user.UserName))
        .Add(Restrictions.Eq("CompanyId", companyId))
        .Add(Restrictions.Eq("OrderStatus", OrderStatusHelper.OrderOpen()))
        .AddOrder(sortOrder)
        .SetMaxResults(1)
        .List<Model.Order>(); // results not always unique

        if(order.Count == 1)
        {
             return order[0];
        }
        else
        {
             return default(Model.Order)
        }

Примерно так.

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