NHibernate的。获得singleOrDefault

时间:2010-06-21 09:39:24

标签: nhibernate

我有以下方法。这将返回单个unqiue订单。但是我只想要第一个结果。实现这一目标的最佳方法是什么?当然我可以返回一个List,然后从中获得第一个结果。

.List<Order>().SingleOrDefault();

当然,通过标准api可以实现这个目标吗?

    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)
            .UniqueResult<Model.Order>(); // results not always unique

2 个答案:

答案 0 :(得分:6)

它比Saint Gerbil提议的稍微复杂一点:

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将返回null。

您也可以使用NHibernate Linq(2.x contrib提供程序,或NH 3.x中集成的提供程序)。在这种情况下,您应该使用FirstOrDefault代替SingleOrDefault来获得所需的结果。

答案 1 :(得分:1)

    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)
        }

像这样。