Смещение дат - посоветуйте, как лучше реализовать
От: 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)

Посоветуйте, пожалуйста, в каком направлении смотреть.
Заранее спасибо.
Re: Смещение дат - посоветуйте, как лучше реализовать
От: ili Россия  
Дата: 28.07.11 13:06
Оценка:
TW>3. Можно, наверное, разработать свой класс (например, ShiftedDate), написать ему свой MemberMapper. Но я не очень понимаю, как в этом случае работать с параметрами (см. пример 2)

да можно и для обычного DateTime написать свой MemberMapper, ктож мешает ))
Re[2]: Смещение дат - посоветуйте, как лучше реализовать
От: TheWind3 Россия  
Дата: 28.07.11 14:11
Оценка:
TW>>3. Можно, наверное, разработать свой класс (например, ShiftedDate), написать ему свой MemberMapper. Но я не очень понимаю, как в этом случае работать с параметрами (см. пример 2)
ili>да можно и для обычного DateTime написать свой MemberMapper, ктож мешает ))

1. А когда он будет срабатывать ? Будет ли он срабатывать в в случае "пример 2" ?
2. А как отличить ситуацию "объект читается из БД" от ситуации "один объект просто копируется в другой ?" Или второй ситуации никогда не произойдет ?
Re[3]: Смещение дат - посоветуйте, как лучше реализовать
От: ili Россия  
Дата: 29.07.11 04:55
Оценка:
Здравствуйте, TheWind3, Вы писали:

TW>>>3. Можно, наверное, разработать свой класс (например, ShiftedDate), написать ему свой MemberMapper. Но я не очень понимаю, как в этом случае работать с параметрами (см. пример 2)

ili>>да можно и для обычного DateTime написать свой MemberMapper, ктож мешает ))

TW>1. А когда он будет срабатывать ? Будет ли он срабатывать в в случае "пример 2" ?

TW>2. А как отличить ситуацию "объект читается из БД" от ситуации "один объект просто копируется в другой ?" Или второй ситуации никогда не произойдет ?

1) вот в случае 2 оно скорее всего не сработает. но есть вариант еще перегрузить PrepareCommand в дата провайдере, в таком случае не надо менять GetValue в MemberMapper
2) мм... вот тут х\з как быть... на уровне MemberMapper об источнике не узнаешь... возможно, ExpressionMapper работает иначе, т.е. там МемберМапперы не будут задействованы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.