2010-06-21 2 views
1

다음 메소드가 있습니다. 단일 unqiue 주문을 반환합니다. 그러나 나는 단지 첫 번째 결과를 원한다. 이를 달성하는 가장 좋은 방법은 무엇입니까? 물론 List를 반환하고 그 결과를 얻을 수 있습니다.NHibernate. singleOrDefault를 얻으십시오

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

확실히이 acheive 멀리 기준 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에 통합 된 제공자)를 사용할 수도 있습니다. 이 경우 SingleOrDefault 대신 FirstOrDefault을 사용해야 원하는 결과를 얻을 수 있습니다.

+1

FirstOrDefault는 SingleOrDefault와 같지 않습니다. First는 첫 번째 레코드를 반환 할 때 하나 이상의 레코드가 발견되면 예외를 throw합니다. –

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

이런 식으로 뭔가.