Практическое занятие 8. Использование LINQ to SQL



LINQ to SQL является удобным инструментом для разработчиков, которым необязательно сопоставление с концептуальной моделью. Использование LINQ to SQL дает возможность напрямую использовать модель программирования LINQ с существующей схемой базы данных. LINQ to SQL позволяет разработчикам формировать классы .NET Framework для представления данных. Вместо сопоставления с концептуальной моделью эти созданные классы указывают напрямую на таблицы базы данных, представления, хранимые процедуры и определяемые пользователем функции.

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

Для создания объектной модели для базы данных, классы должны быть приведены в соответствие с сущностями, хранящимися в базе данных.

Можно выделить три способа реализации такого приведения: задавать атрибуты для существующих объектов самостоятельно, т.е. написать код для атрибута вручную, использовать конструктор, позволяющий автоматически сгенерировать объекты и использовать утилиту командной строки SQLMetal.

Упражнение 1. Создание объектной модели

В упражнении рассматривается способ создания объектной модели для базы данных: задание атрибутов для существующих объектов кодированием вручную.

1. Создайте новое WinForms-приложение (назовите его LINQsql_1).

2. На форму перенесите кнопку и ListBox.

3. Добавьте ссылку на сборку System.Data.Linq и директивы подключения требуемых пространств имен:

using System.Data.Linq;

using System.Data.Linq.Mapping;

4. Создайте класс сущностей (лучше в отдельном файле) Customer и для связывания его с таблицей базы данных к объявлению класса добавьте атрибут Table:

[Table(Name = "Customers")]

public class Customer

{

 

}

5. В классе назначьте свойства CustomerID и City для представления столбцов базы данных, для этого укажите атрибут Column:

   private string _CustomerID;

   [Column(IsPrimaryKey = true, Storage = "_CustomerID")]

   public string CustomerID

   {

       get

       {

           return this._CustomerID;

       }

       set

       {

           this._CustomerID = value;

       }

   }

 

   private string _City;

   [Column(Storage = "_City")]

   public string City

   {

       get

       {

           return this._City;

       }

       set

       {

           this._City = value;

       }

   }

6.  Переопределите метод ToString():

   public override string ToString()

   {

       return CustomerID + "\t" + City;

   }

7. В обработчике события Click для кнопки реализуйте следующую функциональность:

a. Создайте объект класса DataContext, который задает входную точку в базу данных, и в качестве параметра конструктора укажите строку подключения к базе Northwind:

DataContext db = new DataContext

(@"Data Source=(local);Initial Catalog=Northwind;Integrated Security=True");

b. Для объекта класса DataContext используйте метод GetTable, который возвращает коллекцию определенного типа, в данном случае типа Customer и составьте запрос для вывода в ListBox список идентификаторов и городов проживания тех заказчиков, которые живут в Лондоне:

       var results = from c in db.GetTable<Customer>()

                     where c.City == "London"

                     select c;

       foreach (var c in results)

      listBox1.Items.Add(c.ToString());

8. Запустите и протестируйте приложение. По клику кнопки будут выведены идентификаторы и города проживания тех заказчиков, которые живут в Лондоне.

Упражнение 2. Создание связей в базе данных

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

Будут решены следующие основные задачи:

  • Добавление класса сущности, который представляет таблицу "Orders" в базе данных "Northwind".
  • Добавление примечаний к классу Customer, чтобы расширить связи между классами Customer и Order.
  • Создание и выполнение запроса для тестирования процесса получения сведений о классе Order с помощью класса Customer.

1. Откройте приложение, созданное в прошлом упражнении.

2. После определения класса Customer (лучше в отдельном файле) создайте определение класса сущностей Order, включающее следующий код, который указывает, что свойство Order.Customer связано как внешний ключ со свойством Customer.CustomerID:

[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; }

   }

}

3. Если был создан отдельный файл, то добавьте директивы подключения требуемых пространств имен:

using System.Data.Linq;

using System.Data.Linq.Mapping;

4. Добавьте примечания к классу Customer, чтобы указать его связь с классом Order. Вставьте следующий код в класс 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); }

}

5. Удалите компонент ListBox и добавьте компонент ListView.

6. Настройте ListView для дальнейшей работы: в свойстве Columns добавьте три столбца с заголовками (свойство text): CustomerID, City и OrdersCount, свойству View установите вид отображения Details.

7. В обработчике события Click кнопки измените запрос, и реализуйте вывод результата в таблицу компонента listView:

       var custQuery =

     from cust in db.GetTable<Customer>()

     where cust.Orders.Any()

     select cust;

   

       foreach (var custObj in custQuery)

       {

           ListViewItem item =

               listView1.Items.Add(custObj.CustomerID.ToString());

           item.SubItems.Add(custObj.City.ToString());

           item.SubItems.Add(custObj.Orders.Count.ToString());

       }

8. Запустите и протестируйте приложение. По клику кнопки таблица заполнится данными о заказчиках и количество сделанных ими заказов.


Дата добавления: 2019-02-26; просмотров: 203; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!