Exemplarische Vorgehensweise: Beziehungsübergreifende Abfragen (C#) (LINQ to SQL)

Aktualisiert: November 2007

Diese exemplarische Vorgehensweise veranschaulicht die Verwendung von LINQ to SQL-Zuordnungen, um Fremdschlüsselbeziehungen in der Datenbank darzustellen.

Hinweis:

Ihr Computer zeigt für einige der Elemente der Visual Studio-Benutzeroberfläche in der folgenden Anleitung möglicherweise andere Namen oder Standorte an. Diese Elemente sind von der jeweiligen Visual Studio-Version und den verwendeten Einstellungen abhängig. Weitere Informationen finden Sie unter Visual Studio-Einstellungen.

Diese exemplarische Vorgehensweise wurde mithilfe von Visual C#-Entwicklungseinstellungen geschrieben.

Vorbereitungsmaßnahmen

Sie müssen Exemplarische Vorgehensweise: Einfaches Objektmodell und Abfrage (C#) (LINQ to SQL) abgeschlossen haben. 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 der Customer-Klasse und der Order-Klasse zu erweitern.

  • Erstellen und Ausführen einer Abfrage, um das Abrufen von Order-Informationen unter Verwendung der Customer-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 Beziehungen in beide Richtungen zum Erstellen der Verbindung ausreicht. Mithilfe dieser Anmerkung können Sie jedoch leicht in allen Richtungen zwischen den Objekten 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 keine explizite Verknüpfung zwischen Kunden und Bestellungen.

So greifen Sie mithilfe von Customer-Objekten auf Order-Objekte zu

  1. Ä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);
    }
    
  2. 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.

  3. 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 GetTable-Objekts benötigen Sie keine Aufrufe von DataContext. 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

  1. 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) { }
    }
    
  2. Ä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();
    
  3. Drücken Sie F5 um die Anwendung zu debuggen.

    Die Ausgabe im Konsolenfenster lautet:

    ID=WHITC

  4. 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#) (LINQ to SQL)) veranschaulicht, wie Daten bearbeitet werden. Diese exemplarische Vorgehensweise setzt nicht voraus, dass Sie die beiden in dieser Serie abgeschlossenen exemplarischen Vorgehensweisen speichern.

Siehe auch

Konzepte

Lernen mit exemplarischen Vorgehensweisen (LINQ to SQL)