2017-04-03 82 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