У меня возникают проблемы с повторным использованием ProjectionLists в NHibernate QueryOvers. Я не могу понять, как повторно использовать вещи для разных корневых объектов.QueryOver ProjectionList с разными типами корневых сущностей
модель объекта грубо представлена в виде:
завтрак один ко многим кондитерских изделий многих нулевой или-один Кофе
Две отдельные запросы примерно:
session.QueryOver<Breakfast>()
.Where(b => b.Id == searchId)
.Inner.JoinQueryOver(b => b.Pastries,() => pastry)
.Left.JoinAlias(p => p.Coffee,() => coffee)
.Select(projections)
.TransformUsing(Transformers.AliasToBean<TargetDto>())
.List<TargetDto>();
session.QueryOver<Coffee>()
.Where(c => c.Id == searchId)
.Inner.JoinQueryOver(c => c.Pastries,() => pastry)
.Select(projections)
.TransformUsing(Transformers.AliasToBean<TargetDto>())
.List<TargetDto>();
Общие проекции, которые я пытаюсь использовать, выглядят так:
var projections = Projections.ProjectionList()
.Add(Projections.Property(() => pastry.Name,() => target.PastryName))
.Add(Projections.Property(() => coffee.Name,() => target.CoffeeName));
Эти проекции, используя псевдонимы, отлично работают для первого запроса (корень: завтрак), потому что они не пытаются удалить свойства, которые находятся на этом корневом объекте. Во втором запросе (root: Coffee) он взрывается, говоря, что он не может найти «coffee.Name» на Coffee, потому что ему не нравится псевдоним. Синтаксис QueryOver (() => coffee) не помогает, потому что он фактически не регистрирует «кофе» как псевдоним, он просто использует его для вывода типа. О, черт возьми, это была проблема. Существует глупая инфраструктура приложений, которая разбивает синтаксис псевдонима, чтобы на самом деле не использовать псевдоним под ним.
Второй запрос хочет проекции выглядеть следующим образом:
var projections = Projections.ProjectionList()
.Add(Projections.Property(() => pastry.Name,() => target.PastryName))
.Add(Projections.Property<Coffee>(c => c.Name,() => target.CoffeeName));
Однако теперь это несовместимо с первым запросом.
Есть ли способ сделать это, поэтому я могу проецировать свойства, не зная, что такое тип сущности-корня?
Это было именно то решение! Я пробовал это раньше, но я только что нашел, что у моего приложения есть глупая настраиваемая инфраструктура, связывающая вызовы NHibernate, которые нарушили псевдоним версии QueryOver (() => blah). Я знаю проблемы с псевдонимами, было интересно вникать в реализации NHibernate. Я уже использовал выражение как обходное решение. В других новостях: woah. Ваш блог был единственной причиной, по которой мне удалось ** вообще ** получить что-то, работающее с QueryOver, и теперь вы здесь отвечаете на мои вопросы. БЛАГОДАРЯ! :-) –