Delen via


Handleiding: Queries uitvoeren op relaties (C#)

Deze walkthrough demonstreert het gebruik van LINQ to SQL-associaties om foreign-key-relaties in de database weer te geven.

Notitie

Mogelijk worden op uw computer verschillende namen of locaties weergegeven voor sommige elementen van de Visual Studio-gebruikersinterface in de volgende instructies. De Visual Studio-editie die u hebt en de instellingen die u gebruikt, bepalen deze elementen. Zie Personalizing the IDEvoor meer informatie.

Deze walkthrough is geschreven met behulp van Visual C# ontwikkelinstellingen.

Vereiste voorwaarden

U moet stapsgewijze instructies hebben voltooid: Eenvoudig objectmodel en -query (C#). Deze procedure bouwt daarop voort, inclusief de aanwezigheid van het northwnd.mdf-bestand in c:\linqtest5.

Overzicht

Dit stappenplan bestaat uit drie hoofdtaken:

  • Voeg een entiteitsklasse toe om de tabel Orders in de northwind-voorbeelddatabase weer te geven.

  • Het aanvullen van aantekeningen aan de Customer klasse om de relatie tussen de Customer en Order klassen te verbeteren.

  • Een query maken en uitvoeren om het verkrijgen van Order gegevens te testen met behulp van de Customer klasse.

Het in kaart brengen van relaties tussen tabellen

Maak na de Customer klassedefinitie de definitie van de Order entiteitsklasse die de volgende code bevat, waarmee wordt aangegeven dat Order.Customer als een vreemde sleutel verbonden is aan Customer.CustomerID.

De entiteitsklasse Order toevoegen

  • Typ of plak de volgende code na de Customer klasse:

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

De Klantklasse Annoteren

In deze stap maakt u aantekeningen voor de klasse om de Customer relatie met de Order klasse aan te geven. (Deze toevoeging is niet strikt noodzakelijk, omdat het definiƫren van de relatie in beide richtingen voldoende is om de koppeling te maken. Maar door deze aantekening toe te voegen, kunt u eenvoudig door objecten in beide richtingen navigeren.)

De klasse Klant annoteren

  • Typ of plak de volgende code in de Customer klasse:

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

Een query maken en uitvoeren in de Customer-Order-relatie

U kunt nu rechtstreeks vanuit de Order objecten of in omgekeerde volgorde toegang krijgen tot Customer objecten. U hebt geen expliciete koppeling tussen klanten en orders nodig.

Toegang krijgen tot Orderobjecten met behulp van klantobjecten

  1. Wijzig de Main methode door de volgende code in de methode te typen of te plakken:

    // 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. Druk op F5 om fouten in uw toepassing op te sporen.

    Notitie

    U kunt de SQL-code in het consolevenster elimineren door commentaar uit db.Log = Console.Out;te maken.

  3. Druk op Enter in het consolevenster om de foutopsporing te stoppen.

Een sterk getypte weergave van uw database maken

Het is veel eenvoudiger om te beginnen met een sterk getypte weergave van uw database. Door het DataContext object strikt te typen, hoeft u geen aanroepen naar GetTable te doen. U kunt sterk getypte tabellen in al uw query's gebruiken wanneer u het sterk getypte DataContext object gebruikt.

In de volgende stappen maakt u van Customers een sterk getypte tabel die overeenkomt met de tabel Klanten in de database.

Het DataContext-object sterk typen

  1. Voeg de volgende code toe boven de Customer klassedeclaratie.

    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. Wijzig de Main-methode om de sterk getypte DataContext te gebruiken als volgt:

    // 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={custObj.CustomerID}");
    }
    // Freeze the console window.
    Console.ReadLine();
    
  3. Druk op F5 om fouten in uw toepassing op te sporen.

    De uitvoer van het consolevenster is:

    ID=WHITC

  4. Druk op Enter in het consolevenster om de foutopsporing te stoppen.

Volgende stappen

In het volgende scenario (Walkthrough: Gegevens bewerken (C#)) ziet u hoe u gegevens bewerkt. Deze handleiding vereist niet dat u de twee walkthroughs in deze reeks die u al hebt voltooid, opslaat.

Zie ook