Мені потрібно знати, в чому різниця між 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змінюється, коли ви приєднуєтесь до використанняJoinQueryOverJoinQueryOverтаJoinAliasдодайте об’єднання до вашого запиту.JoinAliasне змінюєтьсяTSubType, алеJoinQueryOverзмінюється.- Ви можете використовувати псевдоніми під час створення запиту для посилання на властивості, які не належать
TRootабоTSubType
Kitten kittenAlias = null;таCat catAlias = null;раніше. Я вважаю це брудним, тому я не використовую,JoinAliasякщо це не потрібно.