Так что я закончил тем, что имел вложенный DataReader, один внешний для родительской сущности, чтобы получить всех родителей, а затем один внутренний, который считывает все дочерние элементы в одном выражении, используя reader.NextResult ()метод, подобный следующему:
var exampleSql = "select * from child1Table; " +
"select * from child2Table; " +
"select * from child3Table";
// and so on for the other child tables
using (var outerReader = cmd.ExecuteReader())
{
while (outerReader.Read())
{
var entity = new Entity();
entity.Prop1 = outerReader[0];
entity.Prop2 = outerReader[1];
//.... etc.
using (var cmdInner = new SqlCommand(exampleSql))
using (var innerReader = cmdInner.ExecuteReader())
{
while (innerReader.Read())
{
var child = new Child1();
child.Prop1 = innerReader[0];
// ... etc.
entity.Children1.Add(child);
}
innerReader.NextResult();
while (innerReader.Read())
{
var child = new Child2();
child.Prop1 = innerReader[0];
// ... etc.
entity.Children2.Add(child);
}
innerReader.NextResult();
// and so on for the other child entities
}
}
}
По крайней мере, таким образом, я отправляю только одну SQL-инструкцию в базу данных, чтобы извлечь все мои дочерние сущности для каждого родителя вместо отдельной инструкции для каждого дочернего элемента для родителя.
Если у кого-то есть лучший способ, , пожалуйста, , не стесняйтесь, дайте мне знать.
Кстати, мой пример кода - просто псевдокод.Реальная вещь - это использование параметризованных запросов и отсутствие выбранных звездочек, только нужные мне столбцы.Намерение состоит в том, чтобы показать подход, а не фактическую реализацию.