3 Stimmen

C# SQL übergeordnete Kind-Tabelle wählen Abfrage Hilfe

Ich habe zwei Tabellen, aus denen ich Daten abrufen möchte.

Nennen wir sie "Parent" und "Children". Die Tabelle "Parent" hat viele Datensätze in der Tabelle "Children". (Eins zu Viele)

Mein Problem ist, dass ich eine effiziente Methode für die Anzeige der Daten finden möchte, die die beiden Tabellen in meiner ASP.NET MVC-Anwendung enthalten. Mein Ansatz ist, alle Datensätze aus "Parent" auszuwählen und dann in einer Schleife die Daten aus "Children" auszuwählen.

Also ich brauche Hilfe bei der Gestaltung einer Abfrage für SQL Server 05, die die Daten aus für C# effizienter bekommen kann, ich war die Planung der Erstellung von Typ-Klassen und die "Parent"-Klasse würde eine "Liste", die in meiner Ansicht kann ich Schleife durch die Ausgabe der Werte haben.

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; }
}

Die Daten müssen wie folgt angezeigt werden: (Der Name des "Eltern"-Datensatzes und dann eine Liste von "Kinder"-Datensätzen")

"Elternteil 123"

  • "Kind 1"
  • "Kind 2"
  • "Kind 3"

"Elternteil 124"

  • "Kind 1"
  • "Kind 2"
  • "Kind 3"

5voto

andymeadows Punkte 1284

Ich würde alle Daten auf einmal abrufen und sie dann programmgesteuert durchlaufen.

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

Wenn Sie die Daten zurückerhalten, werden die Eltern wiederholt, so dass Sie sie herausfiltern müssen. Sie können dies über LINQ tun, indem Sie einen übergeordneten Vergleich oder eine for-Schleife bereitstellen. Itereate durch die Liste Zusammenbruch auf eindeutige Eltern als jeder Datensatz wird in der Tat, ein Kind oder eine kinderlose Eltern darstellen.

Informationen über LINQs "distinct" sind hier erhältlich .

2voto

marc_s Punkte 701497

Nun, Sie können jederzeit eine Abfrage schreiben, die einen JOIN über beide Tabellen zurückgibt:

  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

aber in diesem Fall erhalten Sie ein "abgeflachtes" Rowset zurück, in dem die Werte für die übergeordneten Elemente natürlich für jedes ihrer untergeordneten Elemente wiederholt werden (Standard-SQL-Join-Verhalten).

In den Kommentaren wurde darauf hingewiesen, dass bei Verwendung der INNER JOIN Natürlich erhalten Sie nur die Datensätze der Eltern und ihrer Kinder zurück - Eltern ohne Kinder werden nicht berücksichtigt. Wenn Sie auch diese wollen (mit ihren Kindspalten auf NULL gesetzt), verwenden Sie LEFT OUTER JOIN anstelle von INNER JOIN .

Die zweite Möglichkeit wäre eine ADO.NET-Abfrage, die im Grunde zwei Ergebnisse zurückgibt - etwa so

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

aber dann müssen Sie zwei Ergebnissätze aus der Antwort analysieren, die untergeordneten Datensätze mit ihren jeweiligen übergeordneten Datensätzen verknüpfen und weitere Arbeit leisten.

Ihre dritte Möglichkeit wäre, eine "FOR XML"-Abfrage in SQL Server zu erstellen, die ein XML-Dokument zurückgibt, das die Hierarchie der Eltern- und Kind-Datensätze in einem einzigen XML-Dokument darstellt.

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

Was auch immer für Sie am besten funktioniert - Sie haben die Wahl!

Marc

1voto

Mark Redman Punkte 23261

Wenn Sie hierarchische Daten speichern und abrufen möchten, können Sie dies in einer einzigen Tabelle tun. Schauen Sie sich die SQL Server CTE-Ausdrücke (CTE) an. hier ein Beispiel http://msdn.microsoft.com/en-us/library/ms190766.aspx

1voto

olle Punkte 4567

Sie haben nicht wirklich eine klare Frage gestellt, sondern nur ein paar Gedanken geäußert, und ich denke, deshalb hat jemand den Beitrag heruntergestuft, aber ein Kommentar wäre nett gewesen. Wie auch immer, wenn Sie wissen wollen, welche SQL zu verwenden Checkout Elterndatensatz mit allen Kindern in SQL auswählen

Die andere Möglichkeit (die von einigen ORMs verwendet wird) besteht darin, zwei Auswahlen zu treffen, eine für alle Eltern und eine für alle Kinder, und diese dann im Anwendungsspeicher statt auf dem Datenbankserver zu verbinden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X