Пошаговое руководство. Запросы по связям (C#) (LINQ to SQL)

Обновлен: November 2007

В данном пошаговом руководстве демонстрируется использование ассоциаций LINQ to SQL для представления связей внешних ключей в базе данных.

Bb386951.alert_note(ru-ru,VS.90).gifПримечание.

На вашем компьютере названия некоторых элементов интерфейса пользователя Visual Studio или их расположение могут отличаться от указанных в нижеследующих инструкциях. Это зависит от имеющегося выпуска Visual Studio и используемых параметров. Дополнительные сведения см. в разделе Параметры Visual Studio.

Это пошаговое руководство было написано с использованием параметров разработки Visual C#.

Предварительные требования

Необходимо выполнить Пошаговое руководство. Простая модель объектов и простой запрос (C#) (LINQ to SQL). В основе данного пошагового руководства лежит руководство, описываемое в данном разделе; кроме того, в компьютере должен быть файл 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, чтобы начать отладку приложения.

    Bb386951.alert_note(ru-ru,VS.90).gifПримечание.

    Чтобы избежать отображения кода 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. Чтобы остановить отладку, в окне консоли нажмите клавишу ВВОД.

Следующие действия

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

См. также

Основные понятия

Обучение с помощью пошаговых руководств (LINQ to SQL)