|
nhibernate как сделать join с дополнительной таблицей в mapping?
|
|||
---|---|---|---|
#18+
Столкнулся с проблемой что NH втихаря генерирует плохой запрос с IN, который казалось бы не должен возникать, но NH думает что так лучше :) Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Получается что при первом обращении к User.Payments в эту коллекцию загружаются все оплаты пользователя. Все работает как задумано и все последующие запросы типа: Код: c# 1.
работают как положено, не генерируя лишний SQL, т.к. все Payment в коллекции. НО! Когда я делаю запрос чуть глубже чем Payment, например: Код: c# 1.
то это приводит к генерации очень плохого запроса. NH берет все ProductId из коллекции user.Payments и запрашивает их: select * from Product where id in (1,2,3,3,4... тут все id из user.Payments) в плане такой запрос не позволяет использовать индекс, т.к. IN достаточно длинный, что приводит к full scan и падению системы по timeout. Вручную написать запрос с хинтом WITH(INDEX(MyIndex)) - не вариант. Выходом я вижу как-то указать в маппинге для User, что вместе с Payment для поля Payments нужно загрузить ещё и Product. Примерно так: mapping.HasMany(x => x.UserServicePayments).Join(x=>x.Product) Но как это написать на fluetn nhibernate не пойму. Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2015, 15:49 |
|
nhibernate как сделать join с дополнительной таблицей в mapping?
|
|||
---|---|---|---|
#18+
Другими словами я хочу чтобы NH при инициализации коллекции user.Payments делал запрос: Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2015, 15:56 |
|
nhibernate как сделать join с дополнительной таблицей в mapping?
|
|||
---|---|---|---|
#18+
Vadim999то это приводит к генерации очень плохого запроса. NH берет все ProductId из коллекции user.Payments и запрашивает их эта потому что NHibernate унылое преунылое УГ... попробуй не обращаться к навигационным коллекциям хибера.. никогда, тащи запросы из сессии, с критериями, через LINQ-обёртку и прочую ерунду. в EF зато всё работает правильно и красиво :) П.С. да, я типа пропаганду веду тута, ох уж это засилье убожественного NH-а... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2015, 17:28 |
|
nhibernate как сделать join с дополнительной таблицей в mapping?
|
|||
---|---|---|---|
#18+
hVosttэта потому что NHibernate унылое преунылое УГ это потому что надо внимательно читать документацию http://nhibernate.info/doc/nh/en/index.html#persistent-classes-tuplizers ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2015, 18:43 |
|
nhibernate как сделать join с дополнительной таблицей в mapping?
|
|||
---|---|---|---|
#18+
маппинг, скорее всего кривой. делать для такого объекта коллекцию как свойство и мапить её - не правильно. смысл коллекции в маппинге, что она должна грузиться вместе с объектом, типа "табличная часть документа". а так можно сдуру и всю базу выкачать ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2015, 18:55 |
|
nhibernate как сделать join с дополнительной таблицей в mapping?
|
|||
---|---|---|---|
#18+
Код: c# 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2015, 18:57 |
|
nhibernate как сделать join с дополнительной таблицей в mapping?
|
|||
---|---|---|---|
#18+
hVosttв EF зато всё работает правильно и красиво :) он просто ограниченее, пока. и не позволяет (пока) на такие грабли натыкаться. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2015, 19:00 |
|
nhibernate как сделать join с дополнительной таблицей в mapping?
|
|||
---|---|---|---|
#18+
Код: c# 1.
какой-то переворот с подвыподвертом. надо писать нормальный Criteria, ну или чем вы там пользуетесь. linq в NH вроде не особо поддерживается ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2015, 19:10 |
|
nhibernate как сделать join с дополнительной таблицей в mapping?
|
|||
---|---|---|---|
#18+
авторэта потому что NHibernate унылое преунылое УГ... попробуй не обращаться к навигационным коллекциям хибера.. никогда, тащи запросы из сессии, с критериями, через LINQ-обёртку и прочую ерунду. Я конечно же избегаю обращаться к навигационным коллекциям. Но к сожалению это очередной старый проект, который мне дали на сопровождение. Там ВСЯ бизнес логика находится внутри POCO. Медленно и верно переношу её в слой сервисов, но это влечет за собой массивные рефакторинги с изменением сотен файлов. Просто в этот раз хотелось не бить блох утюгом, а обойтись малой кровью... авторpublic IList<Payment> Payments {get;set;} //зачем? Было :) Там конечно сильно сложнее, лишь максимально упростил пример. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2015, 19:12 |
|
nhibernate как сделать join с дополнительной таблицей в mapping?
|
|||
---|---|---|---|
#18+
есть ощущение, что Where(x=>x.Product.Name == n) - это не доменная логика ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2015, 19:13 |
|
nhibernate как сделать join с дополнительной таблицей в mapping?
|
|||
---|---|---|---|
#18+
Vadim999Медленно и верно переношу её в слой сервисов даже страшно представить, что тогда там в этих "POCO" ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2015, 19:15 |
|
nhibernate как сделать join с дополнительной таблицей в mapping?
|
|||
---|---|---|---|
#18+
авторесть ощущение, что Where(x=>x.Product.Name == n) - это не доменная логика Ну значит вы не знаете как мне сделать маппинг. Жаль. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2015, 19:15 |
|
nhibernate как сделать join с дополнительной таблицей в mapping?
|
|||
---|---|---|---|
#18+
автордаже страшно представить, что тогда там в этих "POCO" POCO такие большие что студия тормозит при скролле и их пришлось нарезать на partial classes :) Классический enterprise. 500 полей в каждой сущности :) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2015, 19:17 |
|
nhibernate как сделать join с дополнительной таблицей в mapping?
|
|||
---|---|---|---|
#18+
Vadim999500 полей в каждой сущности ну это нормально ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2015, 19:18 |
|
nhibernate как сделать join с дополнительной таблицей в mapping?
|
|||
---|---|---|---|
#18+
JoinQueryOver тебе нужен Получится типа такого: Код: c# 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2015, 19:51 |
|
nhibernate как сделать join с дополнительной таблицей в mapping?
|
|||
---|---|---|---|
#18+
Дорогой товарищ! Я прекрасно знаю как писать запросы через ISession и я бы с радостью так сделал, но в том месте программы где мне нужно я не могу его получить, без массивного рефакторинга. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2015, 20:21 |
|
nhibernate как сделать join с дополнительной таблицей в mapping?
|
|||
---|---|---|---|
#18+
Ларчик то просто открывался, ребята. Можно ведь указать чтобы Payment всегда джойнил Product с помощью: Код: c# 1.
Это приводит к жадному джойну с продуктами, хотя местами это замедлит работу, но с целом в моем случае это спасение. Удивительно, что это не помогало: Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2015, 00:26 |
|
|
start [/forum/topic.php?fid=17&msg=39085202&tid=1349478]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
175ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 17ms |
total: | 290ms |
0 / 0 |