我有以下方法。这将返回单个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
答案 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)
}
像这样。