Еще раз спасибо за все замечательные ответы, которые вы все опубликовали!
У меня есть две таблицы в SQL. Первый определяет родительский элемент и имеет столбец первичного ключа с именем ParentId. У меня также есть дочерняя таблица с первичным ключом и внешним ключом «ParentId». Таким образом, две таблицы образуют отношения один родитель - много детей.
Вопрос в том, что является наиболее эффективным способом получения кода C # родительских и дочерних данных? Данные должны быть прочитаны в следующие объекты:
public class Parent
{
public int ParentId { get; set; }
public List<Child> Children { get; set; }
// ... many more properties ... //
}
public class Child
{
public int ChildId { get; set; }
public string Description { get; set; }
// ... many more properties ... //
}
Если я использую следующий запрос, я получу родителя и детей сразу, где каждый родитель будет повторяться столько раз, сколько у него будет детей:
SELECT
p.ParentId as 'ParentId',
c.ChildId as 'ChildId',
-- other relevant fields --
FROM
Parents p
INNER JOIN
Children c
ON
p.ParentId = c.ParentId
Используя этот подход, мне нужно было бы найти все уникальные родительские строки, а затем прочитать все дочерние элементы. Преимущество в том, что я совершаю только 1 поездку в БД.
Второй вариант - читать всех родителей по отдельности:
SELECT * FROM Parents
и затем прочитайте всех детей отдельно:
SELECT * FROM Children
и используйте LINQ, чтобы объединить всех родителей с детьми. Этот подход делает 2 поездки в БД.
Третий и последний (также самый неэффективный) подход заключается в том, чтобы захватить всех родителей, и, создавая каждый родительский объект, отправиться в БД, чтобы захватить всех его потомков. Этот подход требует n + 1 соединений: 1 для всех родителей и n количество поездок для получения всех детей для каждого родителя.
Любой совет, как это сделать проще? Конечно, я не могу избежать использования хранимых процедур и не могу использовать LINQ2SQL или EF. Вы бы предпочли Таблицы данных, а не DataReaders, и если да, то как использовать их с подходом 1 или 2?
Спасибо,
Martin