Re: IQuerable: на пороге велосипеда
От: IT Россия linq2db.com
Дата: 15.09.17 00:07
Оценка:
Здравствуйте, 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;
}

ЗЫ. Код условный и рассчитан на творческую переработку.
Если нам не помогут, то мы тоже никого не пощадим.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.