Рассмотрим простейший пример LINQ-выражения:
List a = new List(3);
a.Add(3);
a.Add(12) ;
a.Add(-l);
List positive = a.Where(x => x >= 0).Select(x => x).ToList();
В данном примере создается коллекция типа List
(список целочисленных значений) и заполняется тремя значениями. Последняя строчка — это и есть работа LINQ-механизма, который, используя набор методов LINQ для объектов, позволяет нам выбрать все положительные значения (согласно условию лямбда-выражения) в другой список. Для сравнения посмотрите на фрагмент кода, который выполняет те же действия, но без использования LINQ:
List a = new List(3);
a.Add(3) ;
a.Add(12) ;
a.Add(-1);
List positive = new List();
foreach (int item in a)
{
if (item >= 0)
positive.Add(item) ;
}
То, для чего обычно требовалось несколько строк кода, циклы и условия, теперь можно записать одним выражением в одной строке. Это и есть суть LINQ. В языке C# существует альтернативный вариант записи LINQ-выражений, который выглядит так:
List positive = (
from x in a
where x >= 0
select x
).ToList ();
Как можно заметить, этот вариант во многом похож на синтаксис SQL-запросов. Что и не удивительно, поскольку этот вариант разрабатывался с учетом потребности в написании таких запросов архитекторами SQL-баз данных и специалистов, привыкших к подобному синтаксису. В своих проектах вы можете использовать любой из вариантов либо смешивать их друг с другом. Как показывает практика, каждый из них предпочтителен в разных конкретных случаях.
Рассмотренный пример задействует в себе механизм LINQ для объектов, который позволяет оперировать с коллекциями и другими стандартными наборами данных. Но кроме него огромное значение при работе с данными играют два других LINQ-провайдера: LINQ для SQL и LINQ для сущностей, которые призваны поддержать работу с двумя отдельными друг от друга ORM: LINQ для SQL и Entity Framework.
LINQ для SQL является встроенным в .NET Framework механизмом, что отличает его от появившегося немного позднее Entity Framework. Благодаря этой встроенной поддержке и удобным инструментам мэппинга базы данных, LINQ для SQL получил очень широкое распространение. Способствовало этому также простота работы с ORM и низкий порог вхождения для любого разработчика. Кроме того, для создания ORM-базы данных с помощью LINQ для SQL не требуется писать ни строчки кода (хотя такая возможность и присутствует). В помощь разработчикам был предложен мастер создания модели данных, который формирует особый DBML-файл и файл с необходимыми для мэппинга классами. От разработчика требуется только указать подключение к БД и выбрать необходимые таблицы, все остальное мастер берет на себя (рис. 3.2 и 3.3).
Дальнейшее использование полученной модели данных столь же простое. Разработчику необходимо создать контекст базы данных, внести изменения и подтвердить их. Продемонстрируем это на примере:
protected void DoSomethingWithCustomer(Guid someCustomerld)
{
MyDatabaseDataContext db = new MyDatabaseDataContext();
var customer = db.Customers.SingleOrDefault(
x => x.customerId == someCustomerId);
if (customer != null)
{
customer.name = "Заказчик 1";
db.SubmitChanges();
}
}

Рис. 3.2. Окно создания модели LINQ для SQL

Рис. 3.3. Добавление в LINQ для SQL таблицы Customer
Здесь создается контекст базы данных MyDatabaseDataContext
, ищется пользователь с определенным идентификатором someCustomerid
, если он найден, у него меняется наименование на Заказчик 1 и изменения вносятся в базу данных вызовом метода Submitchanges
. Такой же код, но с использованием механизма ADO.NET, приведен в следующем фрагменте. Вы сами можете сравнить оба способа по требуемому количеству кода и простоте:
protected void DoSomethingWithCustomer(Guid someCustomerId)
{
using (SqlConnection conn = new SqlConnection(@"
Data Source=localhost;
Initial Catalog=BookMVC; Integrated Security=True"
))
{
conn.Open();
SqlCommand cmd = new SqlCommand(@"
SELECT * FROM Customers
WHERE customerId = @customerId", conn);
cmd.Parameters.Add(
new SqlParameter("customerId", someCustomerId));
SqlDataReader reader = cmd.ExecuteReader();
if (reader.Read())
{
SqlCommand updateCmd = new SqlCommand(@"
UPDATE Customers SET name = @name
WHERE customerId = @customerId", conn);
Читать дальше
Конец ознакомительного отрывка
Купить книгу