2013-06-21 2 views
1

나는 QueryOver 대신 Linq에를 사용해야하지만, 다음 쿼리 다시 고군분투 :어떻게 Linq 대신 NHibernate QueryOver를 사용하여이 쿼리를 생성합니까?

public IQueryable<AuctionItem> GetLiveAuctionItems(){ 
    repository.Query<AuctionItem>().Where(IsInActiveAuction() 
} 

public static Expression<Func<AuctionItem, bool>> IsInActiveAuction() 
     { 
      var now = SystemTime.Now(); 
      var expression = PredicateBuilder.True<AuctionItem>(); 
      return expression.And 
       (x => x.Lots.Any(
        z => z.Auction.StartTime < now && z.Auction.EndTime > now && !z.DateWithdrawn.HasValue 
         && z.DateApproved.HasValue)); 
     } 

나는이 하위 쿼리를 생성 실현하지만 queryover 사용하여 만들려고 할 때 필요한 예측을 알리는 오류가 발생할 수 있습니다.

도움을 주시면 감사하겠습니다.

답변

2

클리어 의 빠른 초안. 첫 번째 부분은 subquery는 다음과 같이 수 :

QueryOver<Lot> subQuery = 
    QueryOver.Of<Lot>(() => lot) 
    // Lot WHERE 
    .WhereRestrictionOn(() => lot.DateWithdrawn).IsNull 
    .AndRestrictionOn(() => lot.DateApproved).IsNotNull 
    // Auction JOIN 
    .JoinQueryOver<Auction>(l => l.Auction,() => auction) 
     // Auction WHERE 
     .Where(() => auction.StartTime < now) 
     .Where(() => auction.EndTime > now) 
    // AuctionItem.ID SELECT == projection 
    .Select(Projections.Property(() => lot.AuctionItem.ID)) 
    ; 

그래서, 이것이 우리의 seraching 기준을 충족 않는 AuctionItem.ID을 반환합니다. 그리고 우리는 이것을 다음과 같이 사용할 수 있습니다 :

AuctionItem auctionItem = null; 
var query = session.QueryOver<AuctionItem>(() => auctionItem) 
    .WithSubquery 
    .WhereProperty(() => auctionItem.ID) 
    .In(subQuery) 
    ... 
+0

많은 감사합니다. 나는 내 쿼리가 조인을 생성한다는 질문을 한 후에 깨달았습니다. 대신에 ID 등에서 하위 쿼리를 사용해야합니다. – Richard

관련 문제