LINQ to SQL представляет технологию доступа и управления реляционными данными. Данная технология позволяет составлять запросу к бд в удобной форме в с помощью операторов LINQ, которые затем трансформируются в sql-выражения. Ключевыми объектами здесь являются сущности, которые хранятся в базе данных, контекст данных и запрос LINQ.
Чтобы задействовать LINQ to SQL в проекте, нам надо добавить библиотеку System.Data.Linq.dll:
Для взаимодействия с базой данных в LINQ to SQL используются модели и контекст данных. Модели представляют собой обычные классы, которые сопоставляются с одной из таблиц в базе данных. Пусть у нас есть некоторая база данных usersdb, в которой определена следующая таблица Users:
То есть в таблице Users есть три столбца: Id(тип int), Name(тип nvarchar) и Age(тип int).
Сначала определим сущность для работы с данными из этой таблицы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
using System.Data.Linq.Mapping; namespace L2SApp { [Table(Name = "Users")] public class User { [Column(IsPrimaryKey = true, IsDbGenerated = true)] public int Id { get; set; } [Column(Name = "Name")] public string FirstName { get; set; } [Column] public int Age { get; set; } } } |
Атрибут [Table]
позволяет выполнить сопоставление таблицы из бд с данной моделью. Однако по умолчанию модель должна называться также, как и таблица, то есть Users. Поэтому, чтобы сопоставление прошло успешно, в атрибуте Table указывается свойство Name с именем таблицы.
Каждое свойство модели соответствует столбцу по типу данных. Чтобы происходило автоматическое сопоставление, над свойствами применяется атрибут [Column]. Без данного атрибута система не сможет связать столбец из таблицы со свойством.
Данный атрибут имеет ряд свойств, с помощью которого можно настроить сопоставление столбца:
AutoSync
: указывает, как надо извлекать значение столбца после вставки или обновленияCanBeNull
: указывает, может ли столбец принимать значение nullDbType
: определяет тип столбца. Указывается, если надо создать новую базу данныхExpression
: хранит выражение, которое будет использоваться для вычисления значения свойстваIsPrimaryKey
: хранит логическое значение и указывает, выполняет ли столбец роль первичного ключа (как в данном случае Id)IsDbGenerated
: хранит логическое значение, которое указывает, будет ли значение столбца генерироваться самой бдIsDiscriminator
: указывает, будет ли столбец разграничителем в системе наследования классовIsVersion
: указывает, будет ли столбец хранить номер версии строки или значение timestamp, которое указывает на время последнего изменения строкиName
: задает имя столбца, с которым будет сопоставляться данное свойствоStorage
: указывает на имя приватной переменной, которая будет хранить значение данного столбцаUpdateCheck
: определяет, как LINQ to SQL будет решать проблему параллелизма. Если в модели нет свойств со значение IsVersion=true, то операциях с данными БД будет сравнивать значения строк из таблицы со новыми значениями.
В данном случае название свойства отличается от названия столбца, поэтому в атрибуте надо указать свойство Name, котором передается название столбца, как тут: свойство FirstName будет сопоставляться со столбцом Name.
В данном случае название свойства отличается от названия столбца, поэтому в атрибуте надо указать свойство Name, котором передается название столбца, как тут: свойство FirstName будет сопоставляться со столбцом Name.
В классе программы определим следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System; using System.Linq; using System.Data.Linq; class Program { static string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True"; static void Main(string[] args) { DataContext db = new DataContext(connectionString); // Получаем таблицу пользователей Table<User> users = db.GetTable<User>(); foreach (var user in users) { Console.WriteLine("{0} \t{1} \t{2}", user.Id, user.FirstName, user.Age); } Console.Read(); } } |
Сначала создается контекст данных, который представлен объектом DataContext. В конструктор этого класса передается строка подключения. Через контекст данных мы будем работать с базой данных.
Затем мы получаем таблицу Users:
1 |
Table<User> users = db.GetTable<User>(); |
Фактически здесь мы загружаем все строки из базы данных, которые преобразуются в объекты User: