Здравствуйте, Spinifex, Вы писали:
[Skip]
S>Теперь, если бы в Linq2Db был бы метод(или свойство) Query. На не нужно было бы менять UnitOfWork при каждом добавлении новой коллекции. В примере я оставил пока еще твой _db. В моем случае это должен был бы быть UnitOfWork. Но по неведомым причинам автор Linq2Db решил сделать очень неудобный дизайн.
Нормальный дизайн, все сделано чтобы ты мог писать типизированные запросы не ожидая сайд эфектов. Остальное от лукавого.
Если так приспичило наводить абстракции, то есть и реализации этого всего дела (нагуглил)
https://github.com/ialekseev/Antler
В основном мои сервисы выглядят так
public static class MyDbHelper
{
public static IQueryable<Patient> GetPatients(this DataConnection db)
{
// фильтруем чтобы случайный человек не добрался куда не надо
var userId = User.Identity.GetUserId();
var result = from p in db.Patient
join a in db.PatientAssignments on p.PatientId == a.PatientId
where a.UserId == userId
select p;
return result;
}
public static IQueryable<Patient> GetActivePatients(this DataConnection db, DateTime onDate)
{
var result = from p in db.GetPatients()
where Sql.Between(onDate, p.StartDate, p.EndDate)
select p;
return result;
}
}
Теперь имея только это, я получаю тучу выгод:
Я никогда на ружу случайно не выдам пациента данные которого нельзя видеть. Очень помогает при репортинге.
Могу комбинировать запросы
Сделать агрегацию
Могу вытянуть только ID пациентов, и вся запись тянуться не будет
Одним экспрешином проставить этим записям значение
db.GetActivePatients().Set(p => p.BeHappy = true).Update();
Могу их удалить (всякое бывает)
db.GetActivePatients().Where(p => p.IsDisturbing).Delete();
Сдублировать
db.GetActivePatients().Where(p => p.IsDisturbing).Insert(db.Patient, p => p)();
Думаю не стоит обьяснять сколько кода вам бы пришлось писать используя репозитории?
Игорь когда-то писал что он повыкидал из базы хранимые процедуры и переписал на linq, и наблюдал улучшение производительности всей системы.