Как объединить несколько таблиц отношений 1 ко многим с помощью NHibernate - PullRequest
2 голосов
/ 03 января 2011

У меня есть следующие таблицы:

  1. Приложение
  2. Компонент
  3. Позиция

Приложение может иметь от 1 до многих КомпонентовПриложение может иметь от 1 до нескольких позиций.

Когда я пытаюсь запустить объединение с помощью NHibernate, например:

IEnumerable<Application> applications = Session.Query<Application>()
    .FetchMany(r => r.Components)
    .FetchMany(r => r.Positions)

, и я смотрю на список позиций, в котором есть дублирующиеся позиции.Это исчезнет, ​​если я удалю первые FetchMany():

IEnumerable<Application> applications = Session.Query<Application>()
    .FetchMany(r=>r.Positions)

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

Какие-либо предложения или обходные пути о том, как разрешить мне выполнять несколько соединений «1 ко многим» с помощью NHibernate LINQ, не получая эти дубликаты записей?

Ответы [ 2 ]

2 голосов
/ 04 января 2011

Это не решение, а обходной путь, который работает лучше, чем решение.

Отдельные запросы, вероятно, будут работать лучше, чем один большой запрос, поскольку они получают меньше данных.Вы можете выполнить отдельные запросы одновременно, используя .Future()

Один большой набор результатов с 2 приложениями с 2 компонентами и 2 позициями = 24 элемента

ApplicationColumns ComponentColumns PositionColumns
AppA               ColA             PosA
AppA               ColB             PosA
AppA               ColA             PosB
AppA               ColB             PosB   
AppB               ColC             PosC
AppB               ColD             PosC
AppB               ColC             PosD
AppB               ColD             PosD  

Три небольших набора результатов с 2Приложения с 2 компонентами и 2 позициями = 10 элементов

ApplicationColumns
AppB
AppB

ComponentColumns
ColA
ColB
ColC
ColD

PositionColumns
PosA
PosB
PosC
PosD

Выберите N + 1, и внешнее объединение - не единственный выбор.

0 голосов
/ 04 января 2011

Посмотрите на результат преобразования.Вы должны быть в состоянии добавить это в свой запрос и избавить его от повторяющихся записей.

SetResultTransformer(CriteriaSpecification.DistinctRootEntity)

Вы также можете не использовать методы FetchMany, если хотите использовать отложенную загрузку.Однако это может привести к выполнению многих запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...