Смещение дат - посоветуйте, как лучше реализовать
От: TheWind3 Россия  
Дата: 28.07.11 12:01
Оценка:
Условия
Имеется база данных.
База данных "принадлежит" другой системе, управляется ей, администрируется ей, и т д.
Никакого изменения метаданных БД не допускается: нельзя создать 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)

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