Как применить одну и ту же логику к нескольким объектам сущности - PullRequest
0 голосов
/ 26 октября 2011

У меня около 20 различных таблиц отчетов в моей модели данных сущностей, у всех из которых есть несколько общих полей (таких как start_date и end_date). Когда мое приложение для составления отчетов извлекает данные для данного отчета, первое, что я делаю, это фильтрую таблицу на сегодняшнюю дату. Это означает, что у меня есть блоки кода, подобные этому по всему моему коду (VB):

Dim data = 
    From r in _context.Rpt1 
    Where 
        r.start_date <= Now And 
        r.end_date >= Now

Кажется, должен быть способ поместить эту логику в функцию, которая позволит мне фильтровать любую таблицу, но я не могу понять, как ее структурировать. Я мог бы сделать это:

Public Function FilterByDate(data As IEnumerable) As IEnumerable
    Return From d In data Where d.start_date <= Now And d.end_date >= Now
End Function

но так как возвращаемое значение является универсальным IEnumerable, я теряю все преимущества раннего связывания для определенных столбцов отчета.

Есть ли способ создать одну универсальную функцию, которая может применять некоторую логику к различным объектам и возвращать этот конкретный объект вместо универсального? Альтернативно, есть ли способ привести возвращаемое значение обратно к определенному типу объекта сущности? Есть ли другой способ атаковать этот тип проблемы? Просто ищу идеи или разные взгляды на проблему.

1 Ответ

1 голос
/ 26 октября 2011

Вы можете воспользоваться тем фактом, что сгенерированные сущности являются частичными классами, если любой (или все, если они соответствуют требованиям) реализует интерфейс IFoo, который предоставляет «общие» свойства, такие как start_date и end_date.

Затем вы можете написать универсальный метод фильтрации (код на C #, извините):

public IQueryable<T> Filter<T>(IQueryable<T> queryable) where T : IFoo
{
    var now = DateTime.Now;
    return queryable.Where(q => q.start_date <= now && q.end_date >= now);
}

Это позволит принять любой значимый тип запроса благодаря ограничению универсального типа параметра, новсе еще позволяет вам возвращать точно такой же тип, который был передан благодаря универсальному выводу типа аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...