NHibernate несколько подзапросов с предложением в - PullRequest
0 голосов
/ 04 марта 2019

У меня есть следующий рабочий запрос 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.Конечно, с несколькими поездками в БД для каждой сущности это работает, но я бы хотел сделать это за одну поездку.Посмотрел примеры с отдельными запросами, такими как this , this или this , но ни один из них не работал для меня.Попытался сделать это также с псевдонимами и критериями.

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

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

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

1 Ответ

0 голосов
/ 04 марта 2019

Вы поняли это почти правильно, вам не хватает только .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>();
...