可以说我有一系列形成聚合的对象。
public class C{ public string Details {get;set;} } public class B{ public string Details {get;set;} public List<C> Items {get;set;} } public class A{ public long ID {get;set;} public string Details {get;set;} public List<B> Items {get;set;} }
使用Dapper,从数据库表中填充这些数据的最佳方法是什么(在我的情况下是postgres,但这无关紧要)。该示例中的表与对象模型几乎是一对一的。类上的Items属性表示与每个下级对象的外键关系。即3个表,A与B具有一对多关系,B与C具有一对多关系。
因此,对于给定的AI ID,希望我的对象也具有其所有子数据。
我最好的猜测是我应该以某种方式使用QueryMultiple,但是我不确定如何最好地做到这一点。
我认为我在这里提出的帮助程序:创建对象层次结构的Multi- Mapper可能会有所帮助。
var mapped = cnn.QueryMultiple(sql) .Map<A,B,A> ( A => A.ID, B => B.AID, a, bees => { A.Items = bees}; );
假设您扩展了GridReader并使用了一个映射器:
public static IEnumerable<TFirst> Map<TFirst, TSecond, TKey> ( this GridReader reader, Func<TFirst, TKey> firstKey, Func<TSecond, TKey> secondKey, Action<TFirst, IEnumerable<TSecond>> addChildren ) { var first = reader.Read<TFirst>().ToList(); var childMap = reader .Read<TSecond>() .GroupBy(s => secondKey(s)) .ToDictionary(g => g.Key, g => g.AsEnumerable()); foreach (var item in first) { IEnumerable<TSecond> children; if(childMap.TryGetValue(firstKey(item), out children)) { addChildren(item,children); } } return first; }
您可以扩展此模式以使用3级层次结构。