Ответ 1
Я думаю, что помощник, который я предлагаю здесь: Multi-Mapper для создания иерархии объектов, может быть полезен.
var mapped = cnn.QueryMultiple(sql)
.Map<A,B,A>
(
A => A.ID,
B => B.AID,
a, bees => { A.Items = bees};
);
Предполагая, что вы расширите свой GridReader и с помощью mapper:
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.