2009-08-16 3 views
2

У меня есть две таблицы, из которых я хочу получить данные.C# SQL родительский дочерний стол select help help

Позволяет называть их «Родительские» и «Дети». Таблица «Родитель» имеет много записей в таблице «Дети». (Один для многих)

Моя проблема заключается в том, что я хочу найти эффективный метод отображения данных, которые две таблицы содержат в моем приложении ASP.NET MVC. Мой подход состоит в том, чтобы выбрать все записи из «Родительского», затем прокрутить каждый из них, выбрав данные из «Дети».

Так что мне нужна помощь в разработке запроса для SQL Server 05, который может получить данные для C# более эффективно, я планировал создавать классы типов, а класс «Родитель» имел бы «Список», который в моем представлении I может циклически выводить значения.

public class Parent_Type 
{ 
    public string Name { get; set; } 
    public List<Children_Type> Children { get; set; } 
} 


public class Children_Type 
{ 
    public string Name { get; set; } 
} 

нужны данные, которые будут отображаться как: (Название «Родитель» запись затем список «Дети» записей «)

„Родительские 123“

  • » ребенка 1"
  • "Ребенок 2"
  • "Ребенок 3"

"Родитель 124"

  • "Ребенок 1"
  • "Ребенок 2"
  • "Ребенок 3"
+0

Я думал, что это разумный вопрос, кто-то дал ему минус. Я думал, что должен быть лучший метод, чем выбор всех записей из «Родитель», а затем в цикле для таблицы «Дети» для получения подробной информации. – Phil

ответ

5

Я бы вытащить все данные сразу, а затем запустить через него программно.

SELECT Parent.Id, Parent.Name FROM Parent 
LEFT OUTER JOIN 
SELECT Child.Id AS ChildId, Child.Name AS ChildName FROM Child 
ON 
Child.ParentId = Parent.Id 
ORDER BY Parent.Name 

Когда вы вернете данные, родители будут повторены, поэтому вам нужно будет отфильтровать их. Вы можете сделать это через LINQ, предоставив родительское сравнение или через цикл for. Истерируйте через список, рушившийся на уникальном родителе, поскольку каждая запись будет, по сути, представлять ребенка или бездетного родителя.

Информация о «отличном» от LINQ - available here.

+0

Спасибо, кажется разумным подходом. – Phil

+0

Решение реализовано с использованием нескольких бит логики и работает блестяще. Чувствуйте себя намного лучше об этом коде :) :) Спасибо! – Phil

+0

Рад, что я мог бы помочь. – andymeadows

1

Если вы хотите хранить и извлекать heirarchical данные, вы можете сделать это в одной таблице, посмотрите выражения SQL Server CTE Expressions (CTE). Пример здесь http://msdn.microsoft.com/en-us/library/ms190766.aspx

1

Вы действительно не задали вопрос, о котором вы только что упоминали, и я думаю, что именно поэтому кто-то забыл, но комментарий был бы приятным. Любые способы, если вы хотите знать, какой SQL использовать checkout Select Parent Record With All Children in SQL

Другой способ (используемый некоторыми ORM) состоит в том, чтобы сделать два выбора. один для всех родителей и один для всех childeren, а затем присоединиться к ним в памяти приложений, а не на сервере базы данных.

1

Ну, вы всегда можете написать запрос, который будет возвращать РЕГИСТРИРУЙТЕСЬ через обе таблицы:

SELECT Parent.ID, Parent.Field2, Parent.Field3, 
     Child.ID, Child.Value2, Child.Value3 
    FROM 
    Parent 
    INNER JOIN (or: LEFT OUTER JOIN) 
    Child ON Parent.ID = Child.ParentID 

, но в этом случае вы получите «сплющенные» ROWSET назад, в котором значения для родители повторяются для каждого из своих дочерних элементов, очевидно (стандартное поведение соединения SQL).

Как указано в комментариях, если вы используете INNER JOIN, конечно, вы вернете родителей и их детские записи - родители без детей будут опущены. Если вы тоже этого хотите, (с их дочерними столбцами, установленными в NULL), используйте LEFT OUTER JOIN вместо INNER JOIN.

Вы второй вариант будет иметь ADO.NET запрос, который возвращает два результата, в основном - что-то вроде

SELECT Parent.ID, Parent.FIeld2, Parent.Field3 ; 
SELECT Child.ID, Child.ParentID, Child.Value2, Child.Value3; 

, но тогда вам придется разобрать два результирующих наборов из ответа, связать дочерние записи с их родителями, и сделать немного больше работы.

Ваш третий вариант заключается в создании запроса «FOR XML» на SQL Server, который возвратит представление документа XML в иерархию записей родителей и детей в одном документе XML.

SELECT 
    Parent.ID, Parent.Field2, Parent.Field3, 
    (SELECT 
     Child.ID, Child.Value2, Child.Value3 
    FROM Child 
    WHERE ParentID = Parent.ID FOR XML AUTO, TYPE, ELEMENTS) 
FROM 
    Parent 
FOR XML 
    AUTO, ROOT('Root'), ELEMENTS 

В зависимости от того, что лучше всего подходит для вас - выбирайте!

Марк

+0

INNER JOIN предполагает, что родитель всегда будет иметь детей. – andymeadows

+0

Я должен добавить, что это равноправный подход, учитывая предъявленные требования. – andymeadows

+0

Да, оба возможны - «это зависит», как обычно! :-) о реальных требованиях (ОП был слишком расплывчатым по этому поводу) –