2009-10-26 3 views
0

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

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); 

ответ

0

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

Query Type 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 - один фильтр, возвращающий один объект:

общественного недействительными makeQuery (строка сущность, Expression> фильтр, действие обратного вызова) {

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

    } 

Что вам нужно сделать, это перегрузить эти и S wap вне фильтра для простого массива фильтров

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

И повторите для получения одиночных и списков.

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

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

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

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

Смежные вопросы