LINQ or ...: join extra tables to statically typed queries?
От: dimgel Россия https://github.com/dimgel
Дата: 28.08.11 11:29
Оценка:
Всем привет. Sorry I did't know how to write subj in russian.

В общем, мне просто интересно, реализовано ли это хоть у кого-нибудь (LINQ, Nemerle) и как выглядит синтаксис. Потому что на скале в моём (не очень, если честно) любимом squeryl этого похоже нет. Проблема следующая:

Допустим, есть распределённая система на нескольких серверах, при этом приложение побито на модули и при сборке приложения под конкретный сервер можно указывать, какие модули в него линковать. К каждому модулю соответствует своя схема (в терминологии PostgreSQL) внутри базы данных. Т.е. если на сервер S1 попадают модули M1 и M2, то база данных этого сервера должна содержать schema m1, schema m2.

Допустим далее, что при наличии локальной схемы m2, модуль M1 может сильно оптимизировать свои запросы к базе, заджойнив таблицы из этой схемы m2 вместо того, чтобы обращаться к API модуля M2 на каждую запись. Можно, конечно, для каждого варианта компоновки написать полный запрос с нуля, но если запрос сложный, то дофига будет задвоений кода. Поэтому мечтается что-то следующего (сорри, синтаксиса LINQ я не знаю, пишу на squeryl):

case class PostX(post: Post, user: User, rating: Option[Rating])

// Общая часть запроса:
var q = from(T.post, T.user)((p,u) => where(u.id === p.authorId) select(PostX(p, u, None)))

if (модуль рейтингов прилинкован к приложению) {
    q = addJoin(q, T.rating)((q,r) => where(r.postId === p.id) select(q.result.copy(rating = Some(r)))
}


В целом, интересуют любые соображения — и непосредственно по сабжу, и по самой архитектурной задумке. (Поэтому и запостил в "архитектуру", а не в "базы".)
Re: LINQ or ...: join extra tables to statically typed queri
От: IT Россия linq2db.com
Дата: 28.08.11 15:15
Оценка: 4 (1)
Здравствуйте, dimgel, Вы писали:

D>В общем, мне просто интересно, реализовано ли это хоть у кого-нибудь (LINQ, Nemerle) и как выглядит синтаксис. Потому что на скале в моём (не очень, если честно) любимом squeryl этого похоже нет. Проблема следующая:


На linq делается без проблем. Сборка запроса по кусочкам в зависимости от множества условий — обычное дело.
Если нам не помогут, то мы тоже никого не пощадим.
Re: LINQ or ...: join extra tables to statically typed queri
От: Ziaw Россия  
Дата: 29.08.11 05:30
Оценка: 4 (1)
Здравствуйте, dimgel, Вы писали:

D>
D>case class PostX(post: Post, user: User, rating: Option[Rating])

D>// Общая часть запроса:
D>var q = from(T.post, T.user)((p,u) => where(u.id === p.authorId) select(PostX(p, u, None)))

D>if (модуль рейтингов прилинкован к приложению) {
D>    q = addJoin(q, T.rating)((q,r) => where(r.postId === p.id) select(q.result.copy(rating = Some(r)))
D>}
D>


Примерно так:
var q = from p in T.post
        from u in T.user
        where u.id == p.authorId
        select new {p, u, rating = (Rating?)null};

if (модуль рейтингов прилинкован к приложению) {
    q = from _q in q
        join r in T.rating on _q.p.id equals r.postId
        select new {_q.p, _q.u, rating = (Rating?)r};
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.