Если вы настаиваете на том, чтобы делать это в ADO.Net, то я бы предложил использовать небольшую хитрость с анонимными типами, LINQ и Enumerable.Range (0,0).
Во-первых, вам нужно создать список анонимного типа (или просто создать реальный класс, который сопоставляется с вашим оператором SQL)
var data = Enumerable.Range(0, 0).Select(x => new
{
QestionId = 0,
Title = "Question.Title",
Description = "Question.Description",
TagId = 0,
Name = "Tag.Name"
}).ToList();
Далее вы выполняете запрос в базу данных ADO.Net и получаете результаты.
Ключевым моментом здесь является написание запроса, который возвращает все данные, которые вы ищете в одном запросе.
using (var conn = GetConnection())
{
using (var cmd = conn.CreateCommand())
{
//Construct a valid SQL statement that joins questions to tags
cmd.CommandText = "SELECT q.*, t.* FROM questions q JOIN tags t ON 1 = 1";
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
data.Add(new
{
QestionId = reader.IsDBNull(0) ? 0 : int.TryParse(reader.GetValue(0).ToString(), out var qId) ? qId : 0,
Title = reader.IsDBNull(1) ? string.Empty : reader.GetValue(1).ToString(),
Description = reader.IsDBNull(2) ? string.Empty : reader.GetValue(2).ToString(),
TagId = reader.IsDBNull(3) ? 0 : int.TryParse(reader.GetValue(3).ToString(), out var tId) ? tId : 0,
Name = reader.IsDBNull(4) ? string.Empty : reader.GetValue(4).ToString()
});
}
}
}
}
Теперь, когда ваш список полностью заполнен всеми строками, вам просто нужно преобразовать их обратно в искомый объект.
var questions = data.GroupBy(x => new {x.QestionId, x.Title, x.Description}).Select(y => new Question
{
Id = y.Key.QestionId,
Title = y.Key.Title,
Description = y.Key.Description,
Tags = y.Select(z => new Tag
{
Id = z.TagId,
Name = z.Name
})
}).ToList();