2017-04-03 83 views
0

我有一個通用Get方法基地倉庫使用返回數據小巧玲瓏像通用QueryMultiple與小巧玲瓏

public T Get<T>(Func<IDbConnection, T> query) 
    { 
     using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDB"].ConnectionString)) 
     { 
      return query.Invoke(db); 
     } 
    } 

但是我現在需要返回多個數據。該DAL查詢如下:

var multi = db.QueryMultiple(getCarDataSp , new { CustomerID = customerId, Year = year }, 
           commandType: CommandType.StoredProcedure)); 

var cars = multi.Read<CarDTO>(); 
var options = multi.Read<CarOptionDTO>(); 

//wire the options to the cars 
foreach(var car in cars){ 
    var carOptions = options.Where(w=>w.Car.CarID == car.CarID);  //I would override Equals in general so you can write w.Car.Equals(car)...do this on a common DataModel class 
    car.Options = carOptions.ToList(); 
} 

是否有可能有一個通用GetMultiple我BaseRepository還是會環繞在我的Get方法得到的多,然後汽車和期權中有自己單獨的問題打電話?

+0

作爲使用情況變得越來越複雜,解決方案變得越來越普遍使用。我不建議在BaseRepository類中加入這樣的東西。如果你打算,你需要幾個用例才能正確構建它。 –

+0

有人認爲是相似的。在那個時候,我已經離開了該方法的實現,而不是它的基本庫,並認爲它適合我的需求。歡呼 –

+0

此代碼添加了什麼值?只是選擇連接字符串。它將整個Dapper表面縮小爲查詢調用。這很聰明,但我不認爲這是個好主意。 – bbsimonbb

回答

1

你可以做這樣的事情,它會返回一個元組,其中包含你之後每種類型的IEnumerables。

在基礎信息庫

(這基本上是一個幫過載的...如果你有更多的類型,您可以添加更多的重載)。

public Tuple<IEnumerable<T1>, IEnumerable<T2>> GetMultiple<T1, T2>(string sql, object parameters, 
             Func<GridReader, IEnumerable<T1>> func1, 
             Func<GridReader, IEnumerable<T2>> func2) 
     { 
      var objs = getMultiple(sql, parameters, func1, func2); 
      return Tuple.Create(objs[0] as IEnumerable<T1>, objs[1] as IEnumerable<T2>); 
     } 

     public Tuple<IEnumerable<T1>, IEnumerable<T2>, IEnumerable<T3>> GetMultiple<T1, T2, T3>(string sql, object parameters, 
             Func<GridReader, IEnumerable<T1>> func1, 
             Func<GridReader, IEnumerable<T2>> func2, 
             Func<GridReader, IEnumerable<T3>> func3) 
     { 
      var objs = getMultiple(sql, parameters, func1, func2, func3); 
      return Tuple.Create(objs[0] as IEnumerable<T1>, objs[1] as IEnumerable<T2>, objs[2] as IEnumerable<T3>); 
     } 

     private List<object> getMultiple(string sql, object parameters,params Func<GridReader,object>[] readerFuncs) 
     { 
      var returnResults = new List<object>(); 
      using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDB"].ConnectionString)) 
      { 
       var gridReader = db.QueryMultiple(sql, parameters); 

       foreach(var readerFunc in readerFuncs) 
       { 
        var obj = readerFunc(gridReader); 
        returnResults.Add(obj); 
       } 
      } 

      return returnResults; 
     } 

中的源庫

(很乾淨,更重要的是,類型!)

public class Foo { } 

     public class Bar { } 

     public void sample() 
     { 
      var sql = "select * from Foo; select * from Bar"; 
      var foosAndBars = this.GetMultiple(sql, new { param = "baz" }, gr => gr.Read<Foo>(), gr => gr.Read<Bar>()); 
      var foos = foosAndBars.Item1; 
      var bars = foosAndBars.Item2; 
     } 
+0

我會放棄這一點。我實際上曾經以爲我們Tuple是要走的路,但是如何正確地返回它卻陷入了困境。你會推薦什麼命名兩個泛型類型?我已經看過T和U之前用過的書T和TU。猜猜T1和T2是好的,或者只是想知道是否有一個標準的約定 –

+0

我認爲短小精靈們使用T1,T2 ...你可以用泛型將其重載到8,而這個元組是極限。 – BlackjacketMack

+0

如果我不知道會有多少個結果集,該怎麼辦? – Manoj