Мені потрібно знати, в чому різниця між JoinQueryOver і JoinAlias, і коли використовувати кожен?
Відповіді:
Функціонально вони роблять те саме, створюють приєднання до іншої сутності. Різниця лише в тому, що вони повертають. 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.
Серія QueryOver - Частина 2: Основи та приєднання Ендрю Вітакер дає дуже гарне пояснення:
Короткий зміст:
IQueryOver
є загальним типом з двома параметрами типуTRoot
іTSubType
.Select
працює,TRoot
тоді як працюють інші методи QueryOverTSubType
.TRoot
залишається таким же, як і при створенні запиту, алеTSubType
змінюється, коли ви приєднуєтесь до використанняJoinQueryOver
JoinQueryOver
таJoinAlias
додайте об’єднання до вашого запиту.JoinAlias
не змінюєтьсяTSubType
, алеJoinQueryOver
змінюється.- Ви можете використовувати псевдоніми під час створення запиту для посилання на властивості, які не належать
TRoot
абоTSubType
Kitten kittenAlias = null;
таCat catAlias = null;
раніше. Я вважаю це брудним, тому я не використовую,JoinAlias
якщо це не потрібно.