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řídamiCustomer
aOrder
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
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); }
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;
.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
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) { } }
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={custObj.CustomerID}"); } // Freeze the console window. Console.ReadLine();
Stisknutím klávesy F5 můžete ladit aplikaci.
Výstup okna konzoly je:
ID=WHITC
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.