通用QueryMultiple与Dapper

我有一个基本存储库,其中包含Generic Get方法,可以使用Dapper返回Data

public T Get(Func 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(); var options = multi.Read(); //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(); } 

是否可以在我的BaseRepository中使用Generic GetMultiple,或者将get多重包装在我的Get方法中,然后将汽车和选项包含在自己独立的Get调用中?

你可以做类似这样的事情,它会返回一个元组,其中包含你所追求的每种类型的IEnumerables。

在Base Repository中

(它基本上是一堆重载……如果你有更多的类型,你可以添加更多的重载)。

 public Tuple, IEnumerable> GetMultiple(string sql, object parameters, Func> func1, Func> func2) { var objs = getMultiple(sql, parameters, func1, func2); return Tuple.Create(objs[0] as IEnumerable, objs[1] as IEnumerable); } public Tuple, IEnumerable, IEnumerable> GetMultiple(string sql, object parameters, Func> func1, Func> func2, Func> func3) { var objs = getMultiple(sql, parameters, func1, func2, func3); return Tuple.Create(objs[0] as IEnumerable, objs[1] as IEnumerable, objs[2] as IEnumerable); } private List getMultiple(string sql, object parameters,params Func[] readerFuncs ) { var returnResults = new List(); 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; } 

在Derived Repository中

(非常干净,更重要的是,输入!)

 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(), gr => gr.Read()); var foos = foosAndBars.Item1; var bars = foosAndBars.Item2; }