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 klassernaCustomer
ochOrder
.Skapa och köra en fråga för att testa att
Order
hämta information med hjälpCustomer
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
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); }
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;
.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
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) { } }
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();
Tryck på F5 för att felsöka programmet.
Konsolfönstrets utdata är:
ID=WHITC
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.