Поделиться через


Пошаговое руководство. Запросы по связям (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"

  1. Измените метод 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);
    }
    
  2. Нажмите клавишу F5, чтобы начать отладку приложения.

    Примечание.

    Чтобы избежать отображения кода SQL в окне "Консоль", преобразуйте db.Log = Console.Out; в комментарий.

  3. Чтобы остановить отладку, в окне консоли нажмите клавишу ВВОД.

Создание строго типизированного представления базы данных

Общая процедура становится гораздо проще, если в начале использовать строго типизированное представление базы данных. Задавая строгую типизацию объекта DataContext, можно избежать вызовов метода GetTable. Строго типизированные таблицы можно использовать в запросах только при использовании строго типизированного объекта DataContext.

В представленных ниже шагах создается объект Customers в качестве строго типизированной таблицы, которая сопоставляется с таблицей "Customers" в базе данных.

Установка строгой типизации объекта "DataContext"

  1. Добавьте следующий код непосредственно перед объявлением класса 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. Измените метод 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();
    
  3. Нажмите клавишу F5, чтобы начать отладку приложения.

    В окне «Консоль"» отобразится следующее.

    ID=WHITC

  4. Чтобы остановить отладку, в окне консоли нажмите клавишу ВВОД.

Next Steps

В следующем пошаговом руководстве (пошаговое руководство. Управление данными (C#)) показано, как управлять данными. Для этого пошагового руководства не требуется сохранять два пошаговых руководства, которые уже выполнены в этой серии.

См. также