Как выбрать объект ссылки в NHibernate queryover
У меня есть сущность со свойством, ссылающимся на другую сущность (ReferenceEntity в примерах).
С помощью HQL я могу сделать следующее:
select e.ReferenceEntity from Entity e where e.Id = :entityId
NHibernate даст мне экземпляр ReferenceEntity без lazy.
С запросом над im пытается сделать это:
Session.QueryOver<Entity>()
.Where(e => e.Id == entityId)
.Select(e => e.ReferenceEntity)
.SingleOrDefault<ReferenceEntity>()
С QueryOver Nhibernate дает мне ReferenceEntity, но ленивый.
Я хочу получить ReferenceEntity с нетерпеливой загрузкой, используя queryover, как я делаю с hql.
Спасибо
3 ответа:
Предложение №1
Вы можете выполнить небольшую манипуляцию LINQ после выполнения запроса, чтобы захватить нужные данные.
var result = Session.QueryOver<Entity>() .Where(e => e.Id == entityId) // Filter, .Fetch(e => e.ReferenceEntity).Eager // join the desired data into the query, .List() // execute database query, .Select(e => e.ReferenceEntity) // then grab the desired data in-memory with LINQ. .SingleOrDefault(); Console.WriteLine("Name = " + result.Name);
Это просто и делает свою работу.
В моем тесте это привело к одному запросу. Вот результат:
SELECT this_.Id as Id0_1_, this_.Name as Name0_1_, this_.ReferenceEntity_id as Referenc3_0_1_, q5379349_r2_.Id as Id1_0_, q5379349_r2_.Name as Name1_0_ FROM [Entity] this_ left outer join [ReferenceEntity] q5379349_r2_ on this_.ReferenceEntity_id=q5379349_r2_.Id WHERE this_.Id = @p0;
Предложение №2
Другим подходом было бы использование подзапроса EXISTS, который был бы немного сложнее, но вернул бы правильный результат в первый раз без какой-либо необходимости в post-database манипуляция:
ReferenceEntity alias = null; var result = Session.QueryOver(() => alias) .WithSubquery.WhereExists(QueryOver.Of<Entity>() .Where(e => e.Id == entityId) // Filtered, .Where(e => e.ReferenceEntity.Id == alias.Id) // correlated, .Select(e => e.Id)) // and projected (EXISTS requires a projection). .SingleOrDefault(); Console.WriteLine("Name = " + result.Name);
Тест-результаты в одном запросе:
SELECT this_.Id as Id1_0_, this_.Name as Name1_0_ FROM [ReferenceEntity] this_ WHERE exists ( SELECT this_0_.Id as y0_ FROM [Entity] this_0_ WHERE this_0_.Id = @p0 and this_0_.ReferenceEntity_id = this_.Id);