У чому різниця між JoinQueryOver та JoinAlias?


88

Мені потрібно знати, в чому різниця між JoinQueryOver і JoinAlias, і коли використовувати кожен?

Відповіді:


108

Функціонально вони роблять те саме, створюють приєднання до іншої сутності. Різниця лише в тому, що вони повертають. JoinQueryOver повертає новий QueryOver з поточним об'єктом, що є об'єктом, що приєднався, тоді як JoinAlias ​​повертає оригінальний QueryOver, який має поточну сутність як вихідну кореневу сутність.

Яким би ви не користувались, це питання особистого смаку: (з http://nhibernate.info/doc/nh/en/index.html#queryqueryover )

IQueryOver<Cat,Kitten> catQuery =
    session.QueryOver<Cat>()
        .JoinQueryOver<Kitten>(c => c.Kittens)
            .Where(k => k.Name == "Tiddles");

і

Cat catAlias = null;
Kitten kittenAlias = null;
IQueryOver<Cat,Cat> catQuery =
    session.QueryOver<Cat>(() => catAlias)
        .JoinAlias(() => catAlias.Kittens, () => kittenAlias)
        .Where(() => kittenAlias.Name == "Tiddles");

Функціонально однакові. Зверніть увагу, як у другому запиті чітко вказано посилання на kittenAlias.


7
Зверніть увагу, що у другому прикладі вам потрібно оголосити псевдоніми Kitten kittenAlias = null;та Cat catAlias = null;раніше. Я вважаю це брудним, тому я не використовую, JoinAliasякщо це не потрібно.
foka

Дякую @foka за це роз’яснення. Я пропустив це і дивувався, чому це не спрацювало.
Mario Tacke

12

Серія QueryOver - Частина 2: Основи та приєднання Ендрю Вітакер дає дуже гарне пояснення:

Короткий зміст:

  • IQueryOverє загальним типом з двома параметрами типу TRootіTSubType
  • .Selectпрацює, TRootтоді як працюють інші методи QueryOver TSubType.
  • TRootзалишається таким же, як і при створенні запиту, але TSubTypeзмінюється, коли ви приєднуєтесь до використанняJoinQueryOver
  • JoinQueryOverта JoinAliasдодайте об’єднання до вашого запиту. JoinAliasне змінюється TSubType, але JoinQueryOverзмінюється.
  • Ви можете використовувати псевдоніми під час створення запиту для посилання на властивості, які не належать TRootабоTSubType
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.