Generics и доступ к базе данных - PullRequest
0 голосов
/ 26 октября 2009

У меня есть следующий метод, который я могу передать лямбда-выражением, чтобы отфильтровать мой результат, а затем метод обратного вызова, который будет работать со списком результатов. Это только одна конкретная таблица в моей системе, я буду использовать эту конструкцию снова и снова. Как я могу создать универсальный метод, скажем, DBget, который принимает в качестве параметра Table (сущность ADO.NET dataservice), и передать фильтр (лямбда-эксперимент).

 public void getServiceDevelopmentPlan(Expression<Func<tblServiceDevelopmentPlan, bool>> filter, Action<List<tblServiceDevelopmentPlan>> callback)
        {
            var query = from employerSector in sdContext.tblServiceDevelopmentPlan.Where(filter)
                        select employerSector;


            var DSQuery = (DataServiceQuery<tblServiceDevelopmentPlan>)query;
            DSQuery.BeginExecute(result =>
            {
                callback(DSQuery.EndExecute(result).ToList<tblServiceDevelopmentPlan>());

            }, null);

    }

Мой первый удар:

public delegate Action<List<Table>> DBAccess<Table>(Expression<Func<Table, bool>> filter);

1 Ответ

0 голосов
/ 27 января 2010

Если вы используете Linq для Ado.NET Dataservices или WCF Dataservices, ваша модель создаст много типизированных. Вообще, хотя вы будете выбирать и фильтровать. Вам нужно следующее, тогда все ваши методы просто конфетка поверх этого:

Тип запроса 1 - один фильтр, возвращает список:

public  void makeQuery<T>(string entity, Expression<Func<T, bool>> filter, Action<List<T>> callback)
    {
        IQueryable<T> query = plussContext.CreateQuery<T>(entity).Where(filter);

        var DSQuery = (DataServiceQuery<T>)query;
        DSQuery.BeginExecute(result =>
        {
            callback(DSQuery.EndExecute(result).ToList<T>());
        }, null);

    }

Тип запроса 2 - один фильтр, возвращает одну сущность:

public void makeQuery (строковая сущность, выражение> фильтр, обратный вызов действия) {

        IQueryable<T> query = plussContext.CreateQuery<T>(entity).Where(filter);
        var DSQuery = (DataServiceQuery<T>)query;
        DSQuery.BeginExecute(result =>
        {
            callback(DSQuery.EndExecute(result).First<T>());
        }, null);

    }

Вам нужно перегрузить их и заменить фильтр на простой массив фильтров

Expression<Func<T, bool>>[] filter

И повторите для сингла и списка возвратов.

Объедините это в синглтон, если вам нужен один текстовый текстовый код, или следите за массивом контекстов в какой-то гибридной фабрике / синглтоне, и вас нет. Позвольте конструктору взять контекст или, если он не указан, используйте его, и вас нет.

Затем я использую это на большой линии, но все в одном месте:

GenericQuery.Instance.Create().makeQuery<tblAgencyBranches>("tblAgencyBranches", f => f.tblAgencies.agencyID == _agency.agencyID, res => { AgenciesBranch.ItemsSource = res; });

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

...