Návod: Dotazování napříč relacemi (C#)

Tento názorný postup ukazuje použití přidružení LINQ to SQL k reprezentaci relací cizích klíčů v databázi.

Poznámka:

Váš počítač může v následujících pokynech zobrazovat odlišné názvy nebo umístění některých prvků uživatelského rozhraní sady Visual Studio. Tyto prvky jsou určeny edicí sady Visual Studio a použitým nastavením. Další informace najdete v tématu Přizpůsobení integrovaného vývojového prostředí.

Tento návod byl napsán pomocí vývojového Nastavení jazyka Visual C#.

Požadavky

Musíte mít dokončený návod: Jednoduchý objektový model a dotaz (C#). Tento názorný postup vychází z tohoto souboru, včetně přítomnosti souboru northwnd.mdf v c:\linqtest5.

Přehled

Tento názorný postup se skládá ze tří hlavních úloh:

  • Přidání třídy entity představující tabulku Orders v ukázkové databázi Northwind

  • Doplnění poznámek ke Customer třídě, aby se zlepšil vztah mezi třídami Customer a Order třídami.

  • Vytvoření a spuštění dotazu k otestování získání Order informací pomocí Customer třídy.

Mapování relací mezi tabulkami

Customer Po definici třídy vytvořte Order definici třídy entity, která obsahuje následující kód, který označuje, že Order.Customer se vztahuje jako cizí klíč k Customer.CustomerID.

Přidání třídy entity Order

  • Za třídu zadejte nebo vložte následující kód Customer :

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

Anotace třídy Customer

V tomto kroku označíte Customer třídu poznámkami, abyste označili její vztah ke Order třídě. (Tento doplněk není nezbytně nutný, protože definování relace v obou směrech stačí k vytvoření propojení. Přidáním této poznámky ale můžete snadno procházet objekty v obou směrech.)

Anotace třídy Customer

  • Do třídy zadejte nebo vložte následující kód Customer :

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

Vytvoření a spuštění dotazu napříč relací objednávky zákazníka

Nyní můžete přistupovat k Order objektům přímo z Customer objektů nebo v opačném pořadí. Nepotřebujete explicitní spojení mezi zákazníky a objednávkami.

Přístup k objektům Objednávky pomocí objektů Zákazník

  1. Upravte metodu Main zadáním nebo vložením následujícího kódu do metody:

    // 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. Stisknutím klávesy F5 můžete ladit aplikaci.

    Poznámka:

    Kód SQL v okně konzoly můžete odstranit zakomentováním db.Log = Console.Out;.

  3. Ladění zastavíte stisknutím klávesy Enter v okně konzoly.

Vytvoření zobrazení databáze se silnými typy

Mnohem jednodušší je začít se zobrazením databáze silného typu. Silným zadáním objektu DataContext nepotřebujete volání GetTable. Tabulky silného typu můžete použít ve všech dotazech, když použijete objekt silného typu DataContext .

V následujících krocích vytvoříte Customers tabulku silného typu, která se mapuje na tabulku Zákazníci v databázi.

Pro silné zadání objektu DataContext

  1. Nad deklaraci třídy přidejte následující kód 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. Upravte metodu Main tak, aby používala DataContext silné typy následujícím způsobem:

    // 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. Stisknutím klávesy F5 můžete ladit aplikaci.

    Výstup okna konzoly je:

    ID=WHITC

  4. Ladění zastavíte stisknutím klávesy Enter v okně konzoly.

Další kroky

Další návod (Návod: Manipulace s daty (C#)) ukazuje, jak manipulovat s daty. Tento názorný postup nevyžaduje uložení dvou návodů v této řadě, které jste už dokončili.

Viz také