Delen via


Overzicht: Query's uitvoeren op relaties (C#)

In dit scenario ziet u hoe LINQ naar SQL-koppelingen wordt gebruikt om relaties met refererende sleutels 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 IDE (Personalizing the IDE) voor meer informatie.

Dit scenario is geschreven met behulp van Visual C# Development Instellingen.

Vereisten

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

Overzicht

Deze procedure 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.

Toewijzingsrelaties tussen tabellen

Maak na de Customer klassedefinitie de definitie van de Order entiteitsklasse die de volgende code bevat, die aangeeft dat Order.Customer deze betrekking heeft op een refererende sleutel.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; }
        }
    }
    

Aantekeningen toevoegen aan de klantklasse

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.)

Aantekeningen toevoegen aan de klasse Klant

  • 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 klantorderrelatie

U kunt nu rechtstreeks vanuit de Customer objecten of in omgekeerde volgorde toegang krijgen tot Order objecten. U hebt geen expliciete deelname 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 sterk te typen, hoeft u geen aanroepen te doen GetTable. U kunt sterk getypte tabellen in al uw query's gebruiken wanneer u het sterk getypte DataContext object gebruikt.

In de volgende stappen maakt Customers u een sterk getypte tabel die is toegewezen aan 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 methode om de Main sterk getypte DataContext methode als volgt te gebruiken:

    // 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. 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 procedure vereist niet dat u de twee scenario's in deze reeks die u al hebt voltooid, opslaat.

Zie ook