Условия
Имеется база данных.
База данных "принадлежит" другой системе, управляется ей, администрируется ей, и т д.
Никакого изменения метаданных БД не допускается: нельзя создать view, нельзя добавлять поля к таблицам, и т д.
При помощи BlToolkit разрабатывается приложение, которое будет читать из этой БД.
Все поля типа "дата" в БД хранятся со смещением в несколько лет.
Например, значение 2030-01-03 означает на самом деле 2010-01-03 (смещение в 10 лет).
Значение смещения хранится в базе данных, в разных экземплярах БД оно может быть разное.
Зачем — отдельный разговор, мы имеет это как данность.
Задача
Хочется, чтобы прикладной программист ничего не знал о таком поведении дат.
К примеру, должны работать следующий код:
using(Db = new AppDb()) {
// Пример 1
from R in Db.Documents select R.DocDate;
foreach(DateTime D in R)
Console.WriteLine(D); // Должна выводиться реальная дата, а не смещенная
// Пример 2
from R in Db.Documents
where R.DocDate == DateTime.Now // В параметры должна подставиться "сдвинутая" дата
select R.Summa;
// Пример 3
from R in Db.Documents
from D in Db.Peroids
where R.DocDate == Periods.Date // Здесь даты сравниваются "как есть"
select R.Id;
}
Возможные варианты решения
1. Можно, конечно, заставить прикладного программиста не забывать о такой особенности БД и велеть ему в нужные моменты прибавлять и вычитать даты руками.
2. Можно написать SqlExpression или SqlFunction и все запросы дат обрамлять этой функцией. Это, конечно, немного лучше, чем (1), но почти одно и то же.
3. Можно, наверное, разработать свой класс (например, ShiftedDate), написать ему свой MemberMapper. Но я не очень понимаю, как в этом случае работать с параметрами (см. пример 2)
Посоветуйте, пожалуйста, в каком направлении смотреть.
Заранее спасибо.