Скачать презентацию LINQ Language-Integrated Query LINQ это Скачать презентацию LINQ Language-Integrated Query LINQ это

LINQ.pptx

  • Количество слайдов: 28

LINQ Language-Integrated Query LINQ Language-Integrated Query

 • LINQ— это набор появившихся в Visual Studio 2008 функций, который значительно расширяет • LINQ— это набор появившихся в Visual Studio 2008 функций, который значительно расширяет возможности синтаксиса языков C# и Visual Basic. • LINQ предоставляет стандартные, простые в изучении шаблоны для запроса и изменения данных и технологии, которые могут быть расширены для поддержки практически любого типа источника данных. • В состав Visual Studio входят сборки поставщиков LINQ для использования LINQ с коллекциями. NET Framework, базами данных SQL Server, наборами данных ADO. NET и XML-документами.

 • В Visual Studio можно писать запросы LINQ на языках Visual Basic и • В Visual Studio можно писать запросы LINQ на языках Visual Basic и C# для обращения к базам данных SQL Server, XML-документам, наборам данных ADO. NET и к любым коллекциям объектов, поддерживающим интерфейс IEnumerable или универсальный интерфейс IEnumerable(Of T). • Также планируется поддержка LINQ для ADO. NET Entity Framework, а сторонние разработчики пишут поставщики LINQ для многих веб-служб и других реализаций баз данных. • Запросы LINQ можно использовать в новых проектах или параллельно с запросами, не относящимися к LINQ, в существующих проектах. Единственное требование: проект должен разрабатываться для платформы. NET Framework версии 3. 5 или более поздней.

Введение в запросы LINQ (C#) • Запрос представляет собой выражение, извлекающее данные из источника Введение в запросы LINQ (C#) • Запрос представляет собой выражение, извлекающее данные из источника данных. Запросы обычно выражаются на специальном языке запросов. • Со временем были разработаны различные языки для различных типов источников данных, например SQL для реляционных баз данных и XQuery для XML. • Таким образом, разработчики вынуждены изучать новый язык запросов для каждого типа источника данных или формата данных, который они должны поддерживать. LINQ упрощает ситуацию, предлагая единообразную модель для работы с данными в различных видах источников и форматов данных. • В запросе LINQ работа всегда осуществляется с объектами.

Для запросов и преобразований данных в XMLдокументах, базах данных SQL, наборах данных ADO. NET, Для запросов и преобразований данных в XMLдокументах, базах данных SQL, наборах данных ADO. NET, коллекциях. NET и любых других форматах, для которых доступен поставщик LINQ, используются одинаковые базовые шаблоны кодирования. Все операции запроса LINQ состоят из трех различных действий. • Получение источника данных. • Создание запроса. • Выполнение запроса.

class Intro. To. LINQ { static void Main() { // The Three Parts of class Intro. To. LINQ { static void Main() { // The Three Parts of a LINQ Query: // 1. Data source. int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 }; // 2. Query creation. // num. Query is an IEnumerable var num. Query = from num in numbers where (num % 2) == 0 select num; // 3. Query execution. foreach (int num in num. Query) { Console. Write("{0, 1} ", num); } }}

Источник данных • В предыдущем примере источником данных является массив, поэтому он неявно поддерживает Источник данных • В предыдущем примере источником данных является массив, поэтому он неявно поддерживает универсальный интерфейс IEnumerable(Of T). Это значит, что к нему можно выполнять запросы с LINQ. • Запрос выполняется в операторе foreach, и оператору foreach требуется интерфейс IEnumerable или IEnumerable(Of T). Типы, которые поддерживают IEnumerable(Of T) или производные интерфейсы, такие как универсальный интерфейс IQueryable(Of T), называются запрашиваемыми типами.

Для запрашиваемого типа, выступающего в качестве источника данных LINQ, не требуются изменения или специальная Для запрашиваемого типа, выступающего в качестве источника данных LINQ, не требуются изменения или специальная обработка. Если источник данных еще не находится в памяти в виде запрашиваемого типа, поставщик LINQ должен представить его как таковой. Например, LINQ to XML загружает XMLдокумент в запрашиваемый тип XElement. // Create a data source from an XML document. using System. Xml. Linq; XElement contacts = XElement. Load(@"c: my. Contact. List. xml");

Запрос • Запрос указывает, какую информацию нужно извлечь из источника или источников данных. При Запрос • Запрос указывает, какую информацию нужно извлечь из источника или источников данных. При необходимости, запрос также указывает способ сортировки, группировки и формирования этих сведений перед возвращением. • Запрос хранится в переменной запроса и инициализируется выражением запроса. Чтобы упростить написание запросов, в C# появился новый синтаксис запроса. • Запрос из предыдущего примера возвращает все четные числа из массива целых чисел. Выражение запроса содержит три предложения: from, where и select. Предложение from указывает источник данных, предложение where применяет фильтр, а предложение select указывает тип возвращаемых элементов.

 • Важно, что в LINQ сама переменная запроса не предпринимает действий и не • Важно, что в LINQ сама переменная запроса не предпринимает действий и не возвращает никаких данных. Она просто хранит сведения, необходимые для предоставления результатов при последующем выполнении запроса. • Оператор foreach является также местом, где извлекаются результаты запроса. Например, в предыдущем запросе переменная итерации num содержит каждое (по очереди) значение в возвращаемой последовательности. • Так как сама переменная запроса никогда не содержит результатов запроса, ее можно выполнять так часто, как необходимо. Например, если база данных непрерывно обновляется отдельным приложением. В приложении можно создать один запрос, получающий последние данные, и его можно выполнять повторно с некоторым интервалом для извлечения каждый разных результатов.

Принудительное немедленное выполнение • Запросы, выполняющие статистические функции над диапазоном исходных элементов, должны сначала Принудительное немедленное выполнение • Запросы, выполняющие статистические функции над диапазоном исходных элементов, должны сначала выполнить итерацию этих элементов. Примерами таких запросов являются Count, Max, Average и First. • Они выполняются без явного оператора foreach, поскольку сам запрос должен использовать foreach для возвращения результата. • Обратите внимание, что такой тип запросов возвращает одиночное значение, а не коллекцию IEnumerable.

Следующий запрос возвращает количество четных чисел в исходном массиве. var even. Num. Query = Следующий запрос возвращает количество четных чисел в исходном массиве. var even. Num. Query = from num in numbers where (num % 2) == 0 select num; int even. Num. Count = even. Num. Query. Count(); Чтобы принудительно вызвать немедленное выполнение любого запроса и кэшировать его результаты, можно вызвать метод To. List(Of TSource) или To. Array(Of TSource). Можно также принудительно выполнить запрос, поместив цикл foreach сразу после выражения запроса. Однако вызов To. List или To. Array также кэширует все данные в одной коллекции объектов.

List<int> num. Query 2 = (from num in numbers where (num % 2) == List num. Query 2 = (from num in numbers where (num % 2) == 0 select num). To. List(); // или так: // num. Query 3 соответствует int[] var num. Query 3 = (from num in numbers where (num % 2) == 0 select num). To. Array();

Основные операции запросов LINQ (C#) • В первую очередь в запросе LINQ нужно указать Основные операции запросов LINQ (C#) • В первую очередь в запросе LINQ нужно указать источник данных. • В C#, как и в большинстве языков программирования, переменная должна быть объявлена до ее использования. • В запросе LINQ первым идет предложение from для указания источника данных (customers) и переменная диапазона (cust). var query. All. Customers = from cust in customers select cust;

 • Переменная диапазона схожа с переменной итерации в цикле foreach за исключением того, • Переменная диапазона схожа с переменной итерации в цикле foreach за исключением того, что в выражении запроса не происходит фактической итерации. • При выполнении запроса переменная диапазона будет использоваться как ссылка на каждый последующий элемент в customers. • Поскольку компилятор может определить тип cust, нет необходимости указывать его в явном виде. Дополнительные переменные диапазона могут быть введены предложением let.

 • В выражении запроса иногда полезно сохранить результат выполнения какой-то составной части выражения, • В выражении запроса иногда полезно сохранить результат выполнения какой-то составной части выражения, чтобы использовать его в последующих предложениях. • Это можно выполнить с помощью ключевого слова let, создающего новую переменную диапазона и инициализирующего ее результатом предоставленного выражения. • После инициализации значением переменная диапазона не может использоваться для хранения другого значения. Однако, если в переменной диапазона хранится запрашиваемый тип, то его можно запросить.

Фильтрация • Возможно, наиболее распространенной операцией запроса является применение фильтра в виде логического выражения. Фильтрация • Возможно, наиболее распространенной операцией запроса является применение фильтра в виде логического выражения. • Фильтр приводит к возвращению запросом только тех элементов, для которых выражение является истинным. Результат создается с помощью предложения where. • Фильтр фактически указывает элементы для исключения из исходной последовательности. В следующем примере возвращаются только customers, находящиеся в Лондоне. var query. London. Customers = from cust in customers where cust. City == "London « select cust;

 • Для применения нужного числа выражений фильтра в предложении where можно использовать знакомые • Для применения нужного числа выражений фильтра в предложении where можно использовать знакомые логические операторы C# AND и OR. • Например, для получения только заказчиков из Лондона AND с именем Devon следует написать следующий код. • where cust. City=="London" && cust. Name == "Devon” • Для получения заказчиков из Лондона или Парижа следует написать следующий код. • where cust. City == "London" || cust. City == "Paris"

Порядок • Часто целесообразно отсортировать возвращенные данные. Предложение orderby сортирует элементы возвращаемой последовательности в Порядок • Часто целесообразно отсортировать возвращенные данные. Предложение orderby сортирует элементы возвращаемой последовательности в зависимости от компаратора по умолчанию для сортируемого типа. Например, следующий запрос может быть расширен для сортировки результатов на основе свойства Name. • Поскольку Name является строкой, сравнение по умолчанию выполняется в алфавитном порядке от А до Я.

var query. London. Customers 3 = from cust in customers where cust. City == var query. London. Customers 3 = from cust in customers where cust. City == "London" orderby cust. Name ascending select cust; Для упорядочения результатов в обратном порядке от Я до А используется предложение orderby…descending.

Группировка • Предложение group позволяет группировать результаты на основе указанного ключа. • Например, можно Группировка • Предложение group позволяет группировать результаты на основе указанного ключа. • Например, можно указать, что результаты должны быть сгруппированы по City так, чтобы все заказчики из Лондона или Парижа оказались в отдельных группах. • В этом случае ключом является cust. City.

// query. Customers. By. City is an IEnumerable<IGrouping<string, Customer>> var query. Customers. By. City // query. Customers. By. City is an IEnumerable> var query. Customers. By. City = from cust in customers group cust by cust. City; // customer. Group is an IGrouping foreach (var customer. Group in query. Customers. By. City) { Console. Write. Line(customer. Group. Key); foreach (Customer customer in customer. Group) { Console. Write. Line(" {0}", customer. Name); } }

 • Когда запрос завершается предложением group, результаты представляются в виде списка из списков. • Когда запрос завершается предложением group, результаты представляются в виде списка из списков. Каждый элемент в списке является объектом, имеющим член Key и список элементов, сгруппированных по этому ключу. • При итерации запроса, создающего последовательность групп, необходимо использовать вложенный цикл foreach. Внешний цикл выполняет итерацию каждой группы, а внутренний цикл — итерацию членов каждой группы. • Если необходимо ссылаться на результаты операции группировки, можно использовать ключевое слово into для создания идентификатора, который можно будет запрашивать. Следующий запрос возвращает только те группы, которые содержат более двух заказчиков.

// cust. Query is an IEnumerable<IGrouping<string, Customer>> var cust. Query = from cust in // cust. Query is an IEnumerable> var cust. Query = from cust in customers group cust by cust. City into cust. Group where cust. Group. Count() > 2 orderby cust. Group. Key select cust. Group;

Соединение • Операции соединения создают связи между последовательностями, неявно смоделированными в источниках данных. Например, Соединение • Операции соединения создают связи между последовательностями, неявно смоделированными в источниках данных. Например, можно выполнить соединение для поиска всех клиентов и распространителей, которые находятся в одном месте. • В LINQ предложение join всегда работает с коллекциями объектов, а не непосредственно с таблицами базы данных. var inner. Join. Query = from cust in customers join distributors on cust. City equals dist. City select new { Customer. Name = cust. Name, Distributor. Name = dist. Name };

Выбор (проецирование) • Предложение select создает результаты запроса и задает форму или тип каждого Выбор (проецирование) • Предложение select создает результаты запроса и задает форму или тип каждого возвращаемого элемента. • Например, можно указать, будут ли результаты состоять из полных объектов Customer, только из одного члена, подмножества членов или некоторых совершенно других типов, на основе вычислений или создания новых объектов. • Когда предложение select создает что-либо отличное от копии исходного элемента, операция называется проекцией. Использование проекций для преобразования данных является мощной возможностью выражений запросов LINQ.

class Select. Sample 1 { static void Main() { //Create the data source List<int> class Select. Sample 1 { static void Main() { //Create the data source List Scores = new List() { 97, 92, 81, 60 }; // Create the query. IEnumerable query. High. Scores = from score in Scores where score > 80 select score; // Execute the query. foreach (int i in query. High. Scores) { Console. Write(i + " "); } } } //Output: 97 92 81

Литература • MSDN • Герберт Шилдт, C# 4. 0 полное руководство. — М. : Литература • MSDN • Герберт Шилдт, C# 4. 0 полное руководство. — М. : «Вильямс» , 2011. — С. 1056. • Адам Фримен, Джозеф C. Раттц-мл. LINQ: язык интегрированных запросов в C# 2010 для профессионалов. — М. : «Вильямс» , 2011. — С. 656.