Przewodnik: Wykonywanie zapytań w relacjach (C#)
W tym przewodniku przedstawiono użycie skojarzeń LINQ to SQL do reprezentowania relacji klucza obcego w bazie danych.
Uwaga
Na komputerze w poniższych instrukcjach mogą być wyświetlane inne nazwy i lokalizacje niektórych elementów interfejsu użytkownika programu Visual Studio. Te elementy są określane przez numer wersji Visual Studio oraz twoje ustawienia. Aby uzyskać więcej informacji, zobacz Personalizowanie środowiska IDE.
Ten przewodnik został napisany przy użyciu programu Visual C# Development Ustawienia.
Wymagania wstępne
Musisz ukończyć przewodnik: prosty model obiektów i zapytanie (C#). Ten przewodnik opiera się na tym, w tym obecności pliku northwnd.mdf w c:\linqtest5.
Omówienie
Ten przewodnik składa się z trzech głównych zadań:
Dodanie klasy jednostki do reprezentowania tabeli Orders (Zamówienia) w przykładowej bazie danych Northwind.
Uzupełnienie adnotacji do
Customer
klasy w celu zwiększenia relacji między klasamiCustomer
iOrder
.Tworzenie i uruchamianie zapytania w celu przetestowania uzyskiwania
Order
Customer
informacji przy użyciu klasy .
Mapowanie relacji między tabelami
Customer
Po definicji klasy utwórz definicję Order
klasy jednostki, która zawiera następujący kod, który wskazuje, że Order.Customer
odnosi się jako klucz obcy do Customer.CustomerID
.
Aby dodać klasę jednostki Order
Wpisz lub wklej następujący kod po
Customer
klasie:[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; } } }
Dodawanie adnotacji do klasy klienta
W tym kroku dodasz adnotację Customer
do klasy, aby wskazać jej relację z klasą Order
. (Ten dodatek nie jest ściśle konieczny, ponieważ zdefiniowanie relacji w obu kierunkach jest wystarczające do utworzenia łącza. Jednak dodanie tej adnotacji umożliwia łatwe nawigowanie po obiektach w obu kierunkach).
Aby dodać adnotację do klasy Customer
Wpisz lub wklej następujący kod do
Customer
klasy: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); } }
Tworzenie i uruchamianie zapytania w relacji zamówienie klienta
Teraz można uzyskiwać dostęp do Order
obiektów bezpośrednio z Customer
obiektów lub w odwrotnej kolejności. Nie potrzebujesz jawnego sprzężenia między klientami i zamówieniami.
Aby uzyskać dostęp do obiektów Order przy użyciu obiektów klienta
Zmodyfikuj metodę
Main
, wpisując lub wklejając następujący kod w metodzie :// 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); }
Naciśnij klawisz F5, aby debugować aplikację.
Uwaga
Kod SQL można wyeliminować w oknie Konsola, komentując
db.Log = Console.Out;
element .Naciśnij klawisz Enter w oknie Konsola, aby zatrzymać debugowanie.
Tworzenie silnie typizowanego widoku bazy danych
Znacznie łatwiej jest rozpocząć od silnie typizowanego widoku bazy danych. W przypadku silnego DataContext wpisywania obiektu nie trzeba wywołać metody GetTable. W przypadku używania silnie typizowanego obiektu można użyć silnie typiowanych DataContext tabel we wszystkich zapytaniach.
W poniższych krokach utworzysz Customers
silnie typizowana tabelę, która jest mapowana na tabelę Customers w bazie danych.
Aby silnie wpisać obiekt DataContext
Dodaj następujący kod powyżej deklaracji
Customer
klasy.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) { } }
Zmodyfikuj metodę ,
Main
aby używać silnie typizowanej DataContext metody w następujący sposób:// 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();
Naciśnij klawisz F5, aby debugować aplikację.
Dane wyjściowe okna konsoli to:
ID=WHITC
Naciśnij klawisz Enter w oknie konsoli, aby zatrzymać debugowanie.
Następne kroki
W następnym przewodniku (Przewodnik: manipulowanie danymi (C#)) pokazano, jak manipulować danymi. Ten przewodnik nie wymaga zapisania dwóch przewodników w tej serii, które zostały już ukończone.