|
|
|
LINQ to SQL: выборка из подчиненной таблицы... почему select *... ???
|
|||
|---|---|---|---|
|
#18+
Что-то я не понимаю поведение построителя запросов... пример: Есть табличка Clients и подчиненная ей Users (связь OneToMany, Users.ClientID -> Clients.ID) В результате такое выражение: Код: plaintext 1. 2. Код: plaintext 1. 2. 3. 4. Т.е. загружаются ВСЕ записи, вместо того чтобы выбрать одну через WHERE ClientID = @p0 and ID = @p1 Почему так? В подчиненной таблице может быть тысячи записей, и зачем их грузить все на клиента, если достаточно выбрать одну запросом? p.s. в реальности поиск в client.Users идет не по ID, но это не меняет сути, и ID использован просто для простоты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2010, 15:35 |
|
||
|
LINQ to SQL: выборка из подчиненной таблицы... почему select *... ???
|
|||
|---|---|---|---|
|
#18+
очему - хз, даже сомневаюсь что вы правы, попробуйте использовать LinqPad там можно увидеть сгенерированный запрос но с др. стороны... 1. вы достали клиента 2. у клиента есть незагруженные юзеры 3. ищете юзера у экземпляра клиента 4. список юзеров у клиента - это 1 список, типа 1 объект, и инициализировать одну часть (загружать одного юзера) объекта, было бы нелогично, т.к. список должен быть отсортирован по индексу, потому собственно наверн и загружаются все юзеры 5. зато при поиске следующего юзера не будет запросов :) советую написать так: Код: plaintext 1. 2. 3. тогда точно 1 запрос = 1 запись ор нул ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2010, 14:07 |
|
||
|
LINQ to SQL: выборка из подчиненной таблицы... почему select *... ???
|
|||
|---|---|---|---|
|
#18+
SanSYSочему - хз, даже сомневаюсь что вы правы, попробуйте использовать LinqPad там можно увидеть сгенерированный запрос Естественно смотрел реально полученные запросы, от чего и тема выросла :) Народ пишет что это нормальное поведение большинства фреймворков аля LtoS... SanSYS но с др. стороны... 1. вы достали клиента 2. у клиента есть незагруженные юзеры 3. ищете юзера у экземпляра клиента 4. список юзеров у клиента - это 1 список, типа 1 объект, и инициализировать одну часть (загружать одного юзера) объекта, было бы нелогично, т.к. список должен быть отсортирован по индексу, потому собственно наверн и загружаются все юзеры 5. зато при поиске следующего юзера не будет запросов :) Если следовать идее - контексты создавать на короткое время, и как можно быстрее освобождать, то другие Users будут добываться уже в другом контексте, и сл-но опять будет вытаскиваться на клиента лишние записи. Пример: сущность Project, у неё есть подчиненная табличка Respondents, в которой десятки тысяч записей. И получается что если мне надо выбрать нескольких респов, то я таки не могу использовать удобную запись project.Respondents.Where(r => r....), а вынужден пользовать что-то аля context.Respondents.Where(r => r.ProjectID == pId && r....). Но чем такая запись отличается за чистого SQL? Почти ничем... получается что есть у нас DataContext, в нем есть куча таблиц, и с ними напрямую и приходится работать, всегда указывая все параметры выборки явно... теряется как-то абстракция, в бизнес-логику пролезают FK/PK ключи и т.д. Получается что есть sql, чтобы от него абстрагироваться - применяем Linq To Sql, а потом поверх ещё какой-нибудь паттерн аля Repository, и тут наступает нирвана. Но блин, ничего ен мешает выкинуть удобный linq и оставить sql + repository, результат будет тот же, т.к. в бизнес-логике все равно надежнее с ним работать, чтобы иметь полный контроль над вытягиваемыми из базы данными. Речь про базы с по крайней мере несколькими миллионами записей. SanSYS советую написать так: Код: plaintext 1. 2. тогда точно 1 запрос = 1 запись ор нул [/SRC]это понятно, можно и красивее сделать, например в Client добавить функу, типа: Код: plaintext 1. 2. 3. 4. 5. 6. 7. и тогда будет что надо, один запрос на вытягивания одного юзера но блин, это всё какие-то танцы с бубном... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2010, 00:46 |
|
||
|
LINQ to SQL: выборка из подчиненной таблицы... почему select *... ???
|
|||
|---|---|---|---|
|
#18+
чтож, экзекьютквери вам в помощь :) приятно получать раскрытые ответы у нас есть1 большой сайт, там юзается линку, собственно - сохраняе 1 датаконтекст на протяжении всего запроса, это оказалось производительнее чем создавать новые, имхо, но если выборки в каждом запросе не накладные, в противном случае - юзаем новые экземпляры ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2010, 21:37 |
|
||
|
LINQ to SQL: выборка из подчиненной таблицы... почему select *... ???
|
|||
|---|---|---|---|
|
#18+
SanSYSчтож, экзекьютквери вам в помощь :) приятно получать раскрытые ответы у нас есть1 большой сайт, там юзается линку, собственно - сохраняе 1 датаконтекст на протяжении всего запроса, это оказалось производительнее чем создавать новые, имхо, но если выборки в каждом запросе не накладные, в противном случае - юзаем новые экземпляры С ExecuteQuery тоже обнаружились проблемы :) http://www.sql.ru/forum/actualthread.aspx?tid=765340 У меня прям дар, наступать на грабли :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2010, 23:44 |
|
||
|
|

start [/forum/topic.php?fid=17&msg=36676747&tid=1351263]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
169ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 244ms |
| total: | 510ms |

| 0 / 0 |
