2010-06-21 60 views
1

我有以下方法。這將返回一個單一的訂單。但是我只想要第一個結果。什麼是實現這一目標的最佳方式。當然,我可以返回一個List,然後從中獲得第一個結果。NHibernate。得到單或默認

.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 

回答

6

這是略少複雜得多,聖沙鼠提出:

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

這將使用DB語法檢索只有一條記錄做一個查詢。

如果沒有符合標準的記錄,則UniqueResult返回null。您也可以使用NHibernate Linq(2.x contrib提供程序或NH 3.x中集成的提供程序)。在這種情況下,您應該使用FirstOrDefault而不是SingleOrDefault來實現您想要的結果。

+1

請注意,FirstOrDefault與SingleOrDefault不同。當發現多於一條記錄時,Single應該拋出異常,因爲First將只返回找到的第一條記錄。 – 2016-04-14 12:45:48

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

這樣的事情。