Dela via


Genomgång: Fråga mellan relationer (C#)

Den här genomgången visar hur LINQ till SQL-associationer används för att representera sekundärnyckelrelationer i databasen.

Kommentar

Datorn kan visa olika namn eller platser för vissa av Visual Studio-användargränssnittselementen i följande instruktioner. Den Visual Studio-utgåva som du har och de inställningar som du använder avgör dessa element. Mer information finns i Anpassa IDE.

Den här genomgången skrevs med hjälp av Visual C# Development Inställningar.

Förutsättningar

Du måste ha slutfört genomgången: Enkel objektmodell och fråga (C#). Den här genomgången bygger på den, inklusive förekomsten av den northwnd.mdf filen i c:\linqtest5.

Översikt

Den här genomgången består av tre huvuduppgifter:

  • Lägga till en entitetsklass för att representera tabellen Beställningar i northwind-exempeldatabasen.

  • Komplettera anteckningar till Customer klassen för att förbättra relationen mellan klasserna Customer och Order .

  • Skapa och köra en fråga för att testa att Order hämta information med hjälp Customer av klassen.

Mappa relationer mellan tabeller

Efter klassdefinitionen Customer skapar du entitetsklassdefinitionen Order som innehåller följande kod, vilket anger att Order.Customer relaterar som en sekundärnyckel till Customer.CustomerID.

Så här lägger du till entitetsklassen Order

  • Skriv eller klistra in följande kod efter Customer klassen:

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

Kommentera kundklassen

I det här steget kommenterar Customer du klassen för att ange dess relation till Order klassen. (Detta tillägg är inte absolut nödvändigt, eftersom det räcker att definiera relationen i båda riktningarna för att skapa länken. Men om du lägger till den här anteckningen kan du enkelt navigera i objekt i båda riktningarna.)

Så här kommenterar du kundklassen

  • Skriv eller klistra in följande kod i Customer klassen:

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

Skapa och köra en fråga i kundorderrelationen

Nu kan du komma åt Order objekt direkt från objekten Customer eller i motsatt ordning. Du behöver ingen explicit koppling mellan kunder och beställningar.

Så här kommer du åt Order-objekt med hjälp av kundobjekt

  1. Main Ändra metoden genom att skriva eller klistra in följande kod i metoden:

    // 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. Tryck på F5 för att felsöka programmet.

    Kommentar

    Du kan eliminera SQL-koden i konsolfönstret genom att kommentera ut db.Log = Console.Out;.

  3. Tryck på Retur i konsolfönstret för att sluta felsöka.

Skapa en starkt typad vy av databasen

Det är mycket enklare att börja med en starkt skriven vy av databasen. Genom att DataContext starkt skriva objektet behöver du inte anrop till GetTable. Du kan använda starkt skrivna tabeller i alla dina frågor när du använder det starkt skrivna DataContext objektet.

I följande steg skapar Customers du som en starkt skriven tabell som mappar till tabellen Kunder i databasen.

Så här skriver du datacontextobjektet

  1. Lägg till följande kod ovanför klassdeklarationen Customer .

    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. Main Ändra metoden så att den använder den starkt skrivna DataContext enligt följande:

    // 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. Tryck på F5 för att felsöka programmet.

    Konsolfönstrets utdata är:

    ID=WHITC

  4. Tryck på Retur i konsolfönstret för att sluta felsöka.

Nästa steg

Nästa genomgång (Genomgång: Manipulera data (C#)) visar hur du manipulerar data. Den här genomgången kräver inte att du sparar de två genomgångarna i den här serien som du redan har slutfört.

Se även