Как можно создать этот запрос, используя NHibernate QueryOver вместо Linq?

Мне нужно использовать QueryOver вместо Linq, но я изо всех сил пытаюсь воссоздать следующий запрос:

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

Я понимаю, что это создает подзапросы, но когда я пытаюсь создать с помощью запроса, я получаю ошибки с указанием необходимых проекций.

Любая помощь очень ценится.


person Richard    schedule 21.06.2013    source источник


Ответы (1)


Краткий набросок с четким инструкцией. Первая часть, 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))
    ;

Итак, это вернет AuctionItem.ID, который соответствует нашим критериям поиска. И мы можем использовать это так:

AuctionItem auctionItem = null;
var query = session.QueryOver<AuctionItem>(() => auctionItem)
    .WithSubquery
    .WhereProperty(() => auctionItem.ID)
    .In(subQuery)
    ...
person Radim Köhler    schedule 22.06.2013
comment
Большое спасибо. После того, как я задал вопрос, я понял, что мой запрос генерирует соединения, и вместо этого я должен использовать подзапрос для идентификатора в и т. Д. - person Richard; 24.06.2013