NHibernate несколько подзапросов с предложением в

2

У меня есть следующий рабочий запрос SQL:

SELECT * FROM truck t
WHERE t.currentlocationdbid IN (SELECT dbid FROM location WHERE name = 'Los Angeles')
OR t.nextdestinationdbid IN (SELECT dbid FROM location WHERE name = 'Chicago' OR name = 'New York');

Я хотел бы написать это в NHibernate. Конечно, с несколькими поездками в БД для каждой сущности это работает, но я бы хотел сделать это за одну поездку. Посмотрел примеры с отдельными запросами вроде этого, этого или этого, но ни один не работал для меня. Пытался сделать это также с псевдонимами и критериями.

Одна из десятков попыток:

var subQuery1 = QueryOver.Of<LocationEntity>().Where(l => l.Name == LocationNameEnum.LA);
var subQuery2 = QueryOver.Of<LocationEntity>().Where(l => l.Name == LocationNameEnum.CHG || l.Name == LocationNameEnum.NY);

var poc = session.QueryOver<TruckEntity>()
                 .WithSubquery.WhereProperty(t => t.CurrentLocation).In(subQuery1)
                 .WithSubquery.WhereProperty(t => t.NextDestination).In(subQuery2)
                 .List<TruckEntity>();

Заранее спасибо за любое предложение.

Теги:
nhibernate
nhibernate-queryover
queryover

1 ответ

2
Лучший ответ

Вы поняли это почти правильно, вам не хватает только .Where(Restrictions.Disjunction()...) для or в SQL.

На основе вашего кода (при условии, что у вас есть Id свойства в LocationEntity):

// get IDs to look for in CurrentLocation
var subQuery1 = QueryOver.Of<LocationEntity>()
    .Where(l => l.Name == LocationNameEnum.LA)
    .Select(x => x.Id);

// get IDs to look for in NextDestination
var subQuery2 = QueryOver.Of<LocationEntity>()
    .Where(l => l.Name == LocationNameEnum.CHG || l.Name == LocationNameEnum.NY)
    .Select(x => x.Id);

var poc = session.QueryOver<TruckEntity>()
    .Where(Restrictions.Disjunction() // this takes care of the OR
        .Add(Subqueries.WhereProperty<TruckEntity>(x => x.CurrentLocation.Id).In(subQuery1))
        .Add(Subqueries.WhereProperty<TruckEntity>(x => x.NextDestination.Id).In(subQuery2))
    )
    .List<TruckEntity>();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню