Exemplarische Vorgehensweise: Beziehungsübergreifendes Abfragen (C#)
Diese exemplarische Vorgehensweise veranschaulicht die Verwendung von LINQ to SQL-Zuordnungen, um Fremdschlüsselbeziehungen in der Datenbank darzustellen.
Hinweis
Auf Ihrem Computer werden möglicherweise andere Namen oder Speicherorte für die Benutzeroberflächenelemente von Visual Studio angezeigt als die in den folgenden Anweisungen aufgeführten. Diese Elemente sind von der jeweiligen Visual Studio-Version und den verwendeten Einstellungen abhängig. Weitere Informationen finden Sie unter Personalisieren der IDE.
Diese exemplarische Vorgehensweise wurde mithilfe von Visual C#-Entwicklungseinstellungen geschrieben.
Voraussetzungen
Sie müssen folgendes abgeschlossen haben: exemplarische Vorgehensweise: Einfaches Objektmodell und Abfrage (C#). Diese exemplarische Vorgehensweise basiert auf jener und erfordert die Datei northwnd.mdf im Verzeichnis c:\linqtest5.
Übersicht
Diese exemplarische Vorgehensweise umfasst drei Hauptaufgaben:
Hinzufügen einer Entitätsklasse zur Darstellung der Orders-Tabelle in der Beispieldatenbank Northwind.
Ergänzen von Anmerkungen zur
Customer
-Klasse, um die Beziehung zwischen derCustomer
-Klasse und derOrder
-Klasse zu erweitern.Erstellen und Ausführen einer Abfrage, um das Abrufen von
Order
-Informationen unter Verwendung derCustomer
-Klasse zu testen
Zuordnen von Beziehungen über Tabellen hinweg
Erstellen Sie nach der Definition der Customer
-Klasse die Definition der Order
-Entitätsklasse, die den folgenden Code enthält. Dieser gibt an, dass Order.Customer
ein Fremdschlüssel zu Customer.CustomerID
ist.
So fügen Sie die Order-Entitätsklasse hinzu
Geben Sie den folgenden Code nach der
Customer
-Klasse ein, oder fügen Sie ihn ein:[Table(Name = "Orders")] public class Order { private int _OrderID = 0; private string _CustomerID; private EntityRef<Customer> _Customer; public Order() { this._Customer = new EntityRef<Customer>(); } [Column(Storage = "_OrderID", DbType = "Int NOT NULL IDENTITY", IsPrimaryKey = true, IsDbGenerated = true)] public int OrderID { get { return this._OrderID; } // No need to specify a setter because IsDBGenerated is // true. } [Column(Storage = "_CustomerID", DbType = "NChar(5)")] public string CustomerID { get { return this._CustomerID; } set { this._CustomerID = value; } } [Association(Storage = "_Customer", ThisKey = "CustomerID")] public Customer Customer { get { return this._Customer.Entity; } set { this._Customer.Entity = value; } } }
Hinzufügen von Anmerkungen zu einer Customer-Klasse
In diesem Schritt fügen Sie der Customer
-Klasse Anmerkungen hinzu, um deren Beziehung zur Order
-Klasse anzugeben. (Diese Ergänzung ist nicht unbedingt erforderlich, da die Definition der Beziehung in beide Richtungen ausreicht, um die Verknüpfung zu erstellen. Das Hinzufügen dieser Anmerkung ermöglicht es Ihnen jedoch, in beiden Richtungen auf einfache Weise in Objekte zu navigieren.)
So fügen Sie der Customer-Klasse Anmerkungen hinzu
Geben Sie den folgenden Code in die
Customer
-Klasse ein, oder fügen Sie ihn ein:private EntitySet<Order> _Orders; public Customer() { this._Orders = new EntitySet<Order>(); } [Association(Storage = "_Orders", OtherKey = "CustomerID")] public EntitySet<Order> Orders { get { return this._Orders; } set { this._Orders.Assign(value); } }
Erstellen und Ausführen einer Abfrage über die Customer-Order-Beziehung
Sie können nun direkt auf die Order
-Objekte zugreifen, und zwar von den Customer
-Objekten aus oder in umgekehrter Richtung. Sie benötigen keinen expliziten Join zwischen Kunden und Bestellungen.
So greifen Sie mithilfe von Customer-Objekten auf Order-Objekte zu
Ändern Sie die
Main
-Methode durch das Eingeben oder Einfügen des folgenden Codes in die Methode:// Query for customers who have placed orders. var custQuery = from cust in Customers where cust.Orders.Any() select cust; foreach (var custObj in custQuery) { Console.WriteLine("ID={0}, Qty={1}", custObj.CustomerID, custObj.Orders.Count); }
Drücken Sie F5, um die Anwendung zu debuggen.
Hinweis
Sie können den SQL-Code im Konsolenfenster eliminieren, indem Sie
db.Log = Console.Out;
auskommentieren.Drücken Sie die EINGABETASTE im Konsolenfenster, um das Debuggen zu stoppen.
Erstellen einer Datenbankansicht mit strikter Typbindung
Es ist viel leichter, mit einer Datenbankansicht mit strikter Typbindung zu beginnen. Bei strikter Typbindung des DataContext-Objekts benötigen Sie keine Aufrufe von GetTable. Sie können Tabellen mit strikter Typbindung in allen Abfragen verwenden, wenn Sie das DataContext-Objekt mit strikter Typbindung verwenden.
In den folgenden Schritten erstellen Sie Customers
als Tabelle mit strikter Typbindung und Zuordnung zur Customers-Tabelle in der Datenbank.
So erstellen Sie die striktre Typbindung für das DataContext-Objekt
Fügen Sie den folgenden Code oberhalb der Deklaration der
Customer
-Klasse hinzu.public class Northwind : DataContext { // Table<T> abstracts database details per table/data type. public Table<Customer> Customers; public Table<Order> Orders; public Northwind(string connection) : base(connection) { } }
Ändern Sie die
Main
-Methode wie folgt, damit diese den DataContext mit strikter Typbindung verwendet:// Use a connection string. Northwind db = new Northwind(@"C:\linqtest5\northwnd.mdf"); // Query for customers from Seattle. var custQuery = from cust in db.Customers where cust.City == "Seattle" select cust; foreach (var custObj in custQuery) { Console.WriteLine("ID={0}", custObj.CustomerID); } // Freeze the console window. Console.ReadLine();
Drücken Sie F5, um die Anwendung zu debuggen.
Die Ausgabe im Konsolenfenster lautet:
ID=WHITC
Drücken Sie die EINGABETASTE im Konsolenfenster, um das Debuggen zu stoppen.
Nächste Schritte
Die nächste exemplarische Vorgehensweise (Exemplarische Vorgehensweise: Bearbeiten von Daten (C#)) veranschaulicht, wie Daten bearbeitet werden. Diese exemplarische Vorgehensweise setzt nicht voraus, dass Sie die beiden in dieser Serie abgeschlossenen exemplarischen Vorgehensweisen speichern.