Пошаговое руководство. Запросы по связям (C#)
В этом пошаговом руководстве показано использование связей LINQ to SQL для представления связей внешнего ключа в базе данных.
Примечание.
Отображаемые на компьютере имена или расположения некоторых элементов пользовательского интерфейса Visual Studio могут отличаться от указанных в следующих инструкциях. Это зависит от имеющегося выпуска Visual Studio и используемых параметров. Дополнительные сведения см. в разделе Персонализация среды IDE.
Это пошаговое руководство было написано с использованием параметров разработки Visual C#.
Необходимые компоненты
Необходимо выполнить пошаговое руководство. Простая объектная модель и запрос (C#). В основе данного пошагового руководства лежит руководство, описываемое в данном разделе; кроме того, в компьютере должен быть файл northwnd.mdf в папке c:\linqtest5.
Обзор
Данное пошаговое руководство состоит из трех основных задач.
Добавление класса сущности, который представляет таблицу "Orders" в базе данных "Northwind".
Добавление примечаний к классу
Customer
, чтобы расширить связи между классамиCustomer
иOrder
.Создание и выполнение запроса для тестирования процесса получения сведений о классе
Order
с помощью классаCustomer
.
Сопоставление связей между таблицами
После определения класса Customer
создайте определение класса сущностей Order
, включающее следующий код, который указывает, что свойство Order.Customer
связано как внешний ключ со свойством Customer.CustomerID
.
Добавление класса сущностей "Order"
Введите или вставьте следующий код после определения класса
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; } } }
Добавление примечаний к классу "Customer"
На этом этапе добавляются примечания к классу Customer
, чтобы указать его связь с классом Order
. (Это дополнение не является строго обязательным, так как определение связи в любом направлении достаточно для создания ссылки. Но добавление этой заметки позволяет легко перемещать объекты в любом направлении.)
Добавление примечаний к классу "Customer"
Введите или вставьте следующий код в класс
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); } }
Создание и выполнение запроса в рамках связи "Customer-Order"
Теперь можно получить доступ к объектам Order
непосредственно из объектов Customer
или в обратном направлении. Вам не требуется явное соединение между клиентами и заказами.
Получение доступа к объектам "Order" с помощью объектов "Customer"
Измените метод
Main
посредством ввода или вставки в метод следующего кода:// 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); }
Нажмите клавишу F5, чтобы начать отладку приложения.
Примечание.
Чтобы избежать отображения кода SQL в окне "Консоль", преобразуйте
db.Log = Console.Out;
в комментарий.Чтобы остановить отладку, в окне консоли нажмите клавишу ВВОД.
Создание строго типизированного представления базы данных
Общая процедура становится гораздо проще, если в начале использовать строго типизированное представление базы данных. Задавая строгую типизацию объекта DataContext, можно избежать вызовов метода GetTable. Строго типизированные таблицы можно использовать в запросах только при использовании строго типизированного объекта DataContext.
В представленных ниже шагах создается объект Customers
в качестве строго типизированной таблицы, которая сопоставляется с таблицей "Customers" в базе данных.
Установка строгой типизации объекта "DataContext"
Добавьте следующий код непосредственно перед объявлением класса
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
, чтобы использовать строго типизированный объект DataContext, как показано далее.// 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();
Нажмите клавишу F5, чтобы начать отладку приложения.
В окне «Консоль"» отобразится следующее.
ID=WHITC
Чтобы остановить отладку, в окне консоли нажмите клавишу ВВОД.
Next Steps
В следующем пошаговом руководстве (пошаговое руководство. Управление данными (C#)) показано, как управлять данными. Для этого пошагового руководства не требуется сохранять два пошаговых руководства, которые уже выполнены в этой серии.