Здравствуйте, LWhisper, Вы писали:
LW>Я стою на пороге написания собственного IQuerable, который будет по разному транслировать запросы на стороне клиента и сервера, оттопыривая наружу единый API.
LW>Меня беспокоит тот факт, что придется повторить путь Linq2Db с моделью CodeFirst, собрать все возможные грабли и реализовать не самый простой интерфейс с разбором экспрешшенов.
LW>Есть ли пути проще?
Структуру базы можно сделать одинаковой? Пусть в локальной базе тоже будет таблицы для аккаунтов пользователей, но их использовать не обязательно. Тогда CodeFirst не надо. Просто генерируем одинаковую структуру для обоих версий.
Что касается общего API, то здесь вообще не вижу проблем.
List<Boogie> GetBoogieList(int? userID)
{
using (var db = new BoogieWoogieDataContext())
{
var q =
from b in db.Boogie
....
;
if (userID.HasValue)
{
q =
from t in q
join u in db.Users on t.UserID equals u.UserID
where u.UserID == userID && u.XXX == YYY
select t;
}
return q;
}
как-то так.
К тому же, в шаблоне генерации модели данных ко всем таблицам, в которых есть поле, например, UserID, можно прилепить интерфейс IUserable и тогда вторую часть вышеобозначенного метода можно оформить в виде следующего метода:
IQueriable<T> ApplyUser<T>(IQueriable<T> q, int? userID)
where T : IUserable
{
if (userID.HasValue)
return
from t in q
join u in db.Users on t.UserID equals u.UserID
where u.UserID == userID && u.XXX == YYY
select t;
return q;
}
ЗЫ. Код условный и рассчитан на творческую переработку.