2009-10-26 82 views
0

我有以下方法我可以傳入一個lambda表達式來過濾我的結果,然後回調方法,將工作的結果列表。這只是我係統中的一個特定表格,我會一遍又一遍地使用這個結構。如何構建一個通用方法,比如說DBget將表作爲參數(ADO.NET數據服務實體是公平的)並傳入過濾器(lambda expperssion)。泛型和數據庫訪問

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

    } 

我在這個第一是bash:

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

回答

0

如果您正在使用LINQ to Ado.NET DataService的或WCF DataService的,你的模型將建立你很多的類型。一般來說,你會選擇和過濾。你需要以下內容,然後所有的方法都只是在這之上的糖果:

查詢類型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(string實體,表達>過濾器,操作回調) {

 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 out the filter for a simple array of filters

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

並重復單個和列表返回。

如果你想要一個數據上下文或者跟蹤某種混合工廠/單例中的上下文數組,並且你不在,那麼將它捆綁成單例。讓構造函數接受一個上下文,或者如果提供了non,那麼使用它自己並且你不在。

然後我用這對一個大線,但在同一個地方:

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

這可能看起來很複雜,但它隱藏了許多的異步魔術,並在某些情況下,可以直接從該按鈕的處理程序被稱爲。與其說是3層系統,不如說是一個巨大的節省時間。