LINQ - Краткое руководство

Разработчики во всем мире всегда сталкивались с проблемами при запросе данных из-за отсутствия определенного пути и необходимости владеть множеством технологий, таких как SQL, веб-службы, XQuery и т. Д.

Представленный в Visual Studio 2008 и разработанный Андерсом Хейлсбергом, LINQ (Language Integrated Query) позволяет писать запросы даже без знания языков запросов, таких как SQL, XML и т. Д. Запросы LINQ могут быть написаны для различных типов данных.

Пример запроса LINQ

C #

using System;
using System.Linq;

class Program {
   static void Main() {
   
      string[] words = {"hello", "wonderful", "LINQ", "beautiful", "world"};
		
      //Get only short words
      var shortWords = from word in words where word.Length <= 5 select word;
	    
      //Print each word out
      foreach (var word in shortWords) {
         Console.WriteLine(word);
      }	 
		
      Console.ReadLine();
   }
}

VB

Module Module1
   Sub Main()
      Dim words As String() = {"hello", "wonderful", "LINQ", "beautiful", "world"}
     
      ' Get only short words
      Dim shortWords = From word In words _ Where word.Length <= 5 _ Select word
     
      ' Print each word out.
	  
      For Each word In shortWords
         Console.WriteLine(word)
      Next
	  
      Console.ReadLine()
   End Sub
End Module

Когда приведенный выше код C # или VB компилируется и выполняется, он дает следующий результат:

hello 
LINQ 
world

Синтаксис LINQ

Есть два синтаксиса LINQ. Это следующие.

Синтаксис Lamda (Method)

var longWords = words.Where( w ⇒ w.length > 10);
Dim longWords = words.Where(Function(w) w.length > 10)

Синтаксис запроса (понимания)

var longwords = from w in words where w.length > 10;
Dim longwords = from w in words where w.length > 10

Типы LINQ

Типы LINQ кратко упомянуты ниже.

  • LINQ to Objects
  • LINQ в XML (XLINQ)
  • LINQ to DataSet
  • LINQ to SQL (DLINQ)
  • LINQ to Entities

Помимо вышеуказанного, существует также тип LINQ с именем PLINQ, который является параллельным LINQ от Microsoft.

Архитектура LINQ в .NET

LINQ имеет трехуровневую архитектуру, в которой самый верхний уровень состоит из языковых расширений, а нижний уровень состоит из источников данных, которые обычно являются объектами, реализующими универсальные интерфейсы IEnumerable <T> или IQueryable <T>. Архитектура показана ниже.

Выражения запроса

Выражение запроса - это не что иное, как запрос LINQ, выраженный в форме, аналогичной форме SQL, с такими операторами запроса, как Select, Where и OrderBy. Выражения запроса обычно начинаются с ключевого слова «От».

Для доступа к стандартным операторам запросов LINQ пространство имен System.Query должно быть импортировано по умолчанию. Эти выражения написаны в рамках декларативного синтаксиса запросов, который был в C # 3.0.

Ниже приведен пример, показывающий полную операцию запроса, которая состоит из создания источника данных, определения выражения запроса и выполнения запроса.

C #

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Operators {
   class LINQQueryExpressions {
      static void Main() {
      
         // Specify the data source.
         int[] scores = new int[] { 97, 92, 81, 60 };

         // Define the query expression.
         IEnumerable<int> scoreQuery = from score in scores where score > 80 select score;

         // Execute the query.
		 
         foreach (int i in scoreQuery) {
            Console.Write(i + " ");
         }
		 
         Console.ReadLine();
      }
   }
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат:

97 92 81

Методы расширения

Представленные в .NET 3.5 методы расширения объявляются только в статических классах и позволяют включать пользовательские методы в объекты для выполнения некоторых точных операций запроса для расширения класса, не являясь фактическим членом этого класса. Они также могут быть перегружены.

Вкратце, методы расширения используются для преобразования выражений запросов в вызовы традиционных методов (объектно-ориентированных).

Разница между LINQ и хранимой процедурой

Между LINQ и хранимыми процедурами существует множество различий. Эти различия упоминаются ниже.

  • Хранимые процедуры намного быстрее, чем запрос LINQ, поскольку они следуют ожидаемому плану выполнения.

  • Легче избежать ошибок времени выполнения при выполнении запроса LINQ, чем по сравнению с хранимой процедурой, поскольку первая имеет поддержку Intellisense Visual Studio, а также полную проверку типов во время компиляции.

  • LINQ позволяет выполнять отладку с помощью отладчика .NET, чего нет в случае хранимых процедур.

  • LINQ предлагает поддержку нескольких баз данных в отличие от хранимых процедур, где важно переписать код для различных типов баз данных.

  • Развертывание решения на основе LINQ легко и просто по сравнению с развертыванием набора хранимых процедур.

Потребность в LINQ

До LINQ было важно изучить C #, SQL и различные API-интерфейсы, которые связывают их вместе, чтобы сформировать законченное приложение. Поскольку эти источники данных и языки программирования сталкиваются с несоответствием импеданса; чувствуется потребность в коротком кодировании.

Ниже приведен пример того, сколько разнообразных методов использовалось разработчиками при запросе данных до появления LINQ.

SqlConnection sqlConnection = new SqlConnection(connectString);
SqlConnection.Open();

System.Data.SqlClient.SqlCommand sqlCommand = new SqlCommand();
sqlCommand.Connection = sqlConnection;

sqlCommand.CommandText = "Select * from Customer";
return sqlCommand.ExecuteReader (CommandBehavior.CloseConnection)

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

Northwind db = new Northwind(@"C:\Data\Northwnd.mdf");
var query = from c in db.Customers select c;

Преимущества LINQ

LINQ предлагает множество преимуществ, и главное из них - его мощная выразительность, которая позволяет разработчикам выражать свои мысли декларативно. Некоторые другие преимущества LINQ приведены ниже.

  • LINQ предлагает подсветку синтаксиса, которая помогает обнаруживать ошибки во время разработки.

  • LINQ предлагает IntelliSense, что позволяет легко писать более точные запросы.

  • Написание кода в LINQ происходит намного быстрее, и поэтому время разработки также значительно сокращается.

  • LINQ упрощает отладку благодаря интеграции с языком C #.

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

  • LINQ позволяет использовать один синтаксис LINQ при запросе множества различных источников данных, и это в основном из-за его единой основы.

  • LINQ является расширяемым, что означает, что можно использовать знание LINQ для запроса новых типов источников данных.

  • LINQ предлагает возможность объединения нескольких источников данных в один запрос, а также разбиение сложных проблем на набор коротких запросов, которые легко отлаживать.

  • LINQ предлагает простое преобразование для преобразования одного типа данных в другой, например преобразование данных SQL в данные XML.

Прежде чем начинать работу с программами LINQ, лучше всего сначала разобраться в нюансах настройки среды LINQ. LINQ нужна платформа .NET, революционная платформа для разнообразных приложений. Запрос LINQ можно удобно написать на C # или Visual Basic.

Microsoft предлагает инструменты для обоих этих языков, то есть C # и Visual Basic с помощью Visual Studio. Все наши примеры скомпилированы и написаны в Visual Studio 2010. Однако для использования также доступна версия Visual Basic 2013. Это последняя версия, которая во многом похожа на Visual Studio 2012.

Установка Visual Studio 2010 в Windows 7

Visual Studio можно установить с установочного носителя, например DVD. Учетные данные администратора необходимы для успешной установки Visual Basic 2010 в вашей системе. Перед установкой крайне важно отключить все съемные USB-устройства от системы, иначе установка может быть неудачной. Некоторые из требований к оборудованию, которые необходимо иметь при установке, следующие.

Требования к оборудованию

  • 1,6 ГГц или более
  • 1 ГБ оперативной памяти
  • 3 ГБ (доступное место на жестком диске)
  • Жесткий диск 5400 об / мин
  • Видеокарта, совместимая с DirectX 9
  • DVD-привод

Шаги установки

Step 1 - Сначала после вставки DVD с пакетом Visual Studio 2010 нажмите Install or run program from your media появляется во всплывающем окне на экране.

Step 2- Теперь на экране появится настройка для Visual Studio. выберитеInstall Microsoft Visual Studio 2010.

Step 3- Как только вы нажмете, процесс начнется, и на вашем экране появится окно настройки. После завершения загрузки компонентов установки, которая займет некоторое время, нажмитеNext кнопку, чтобы перейти к следующему шагу.

Step 4 - Это последний шаг установки, и появится стартовая страница, на которой просто выберите «Я прочитал и принимаю условия лицензии» и нажмите Next кнопка.

Step 5- Теперь выберите компоненты для установки на странице параметров, появившейся на вашем экране. Вы можете выбратьFull или же Customвариант. Если у вас меньше дискового пространства, чем требуется, указанное в требованиях к дисковому пространству, выберите Custom.

Step 6- Когда вы выбираете опцию Custom, появляется следующее окно. Выберите функции, которые вы хотите установить, и нажмитеUpdate или переходите к шагу 7. Однако не рекомендуется использовать пользовательский параметр, так как в будущем вам могут понадобиться функции, которых вы не выбрали.

Step 7- Вскоре появится всплывающее окно и начнется установка, которая может занять много времени. Помните, это для установки всех компонентов.

Step 8- Наконец, вы сможете увидеть в окне сообщение об успешном завершении установки. НажмитеFinish.

Написание программы на C # с использованием LINQ в Visual Studio 2010

  • Запустите Visual Studio 2010 Ultimate edition и выберите в меню «Файл», а затем «Новый проект».

  • На вашем экране появится диалоговое окно нового проекта.

  • Теперь выберите Visual C # в качестве категории среди установленных шаблонов, а затем выберите шаблон консольного приложения, как показано на рисунке ниже.

  • Дайте название вашему проекту в нижнем поле имени и нажмите ОК.

  • Новый проект появится в обозревателе решений в правой части нового диалогового окна на вашем экране.

  • Теперь выберите Program.cs в обозревателе решений, и вы сможете просмотреть код в окне редактора, которое начинается с «using System».

  • Здесь вы можете начать писать следующую программу на C #.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
			
namespace HelloWorld {
   class Program {
      static void Main(string[] args) {
      
         Console.WriteLine("Hello World")
         Console.ReadKey();
      } 		
   }
}
  • Нажмите клавишу F5 и запустите свой проект. Настоятельно рекомендуется сохранить проект, выбравFileSave All перед запуском проекта.

Написание программы VB с использованием LINQ в Visual Studio 2010

  • Запустите Visual Studio 2010 Ultimate edition и выберите в меню «Файл», а затем «Новый проект».

  • На вашем экране появится диалоговое окно нового проекта.

  • Теперь выберите Visual Basic в качестве категории среди установленных шаблонов, а затем выберите шаблон консольного приложения.

  • Дайте название вашему проекту в нижнем поле имени и нажмите ОК.

  • Вы получите экран с Module1.vb. Начните писать свой код VB здесь, используя LINQ.

Module Module1

   Sub Main()
      Console.WriteLine("Hello World")
      Console.ReadLine()
   End Sub
   
End Module
  • Нажмите клавишу F5 и запустите свой проект. Настоятельно рекомендуется сохранить проект, выбравFileSave All перед запуском проекта.

Когда приведенный выше код C # или VB скомпилирован и запущен, он дает следующий результат:

Hello World

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

Стандартные операторы запросов LINQ можно разделить на следующие в зависимости от их функциональности.

  • Операторы фильтрации
  • Операторы присоединения
  • Проекционные операции
  • Операторы сортировки
  • Операторы группировки
  • Conversions
  • Concatenation
  • Aggregation
  • Кванторные операции
  • Операции с разделами
  • Генерация операций
  • Установить операции
  • Equality
  • Операторы Элементов

Операторы фильтрации

Фильтрация - это операция по ограничению набора результатов таким образом, чтобы в него входили только выбранные элементы, удовлетворяющие определенному условию.

Показать примеры

Оператор Описание Синтаксис выражения запроса C # Синтаксис выражения запроса VB
где Значения фильтрации на основе функции предиката где где
OfType Фильтровать значения на основе их способности соответствовать указанному типу Непригодный Непригодный

Операторы присоединения

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

Показать примеры

Оператор Описание Синтаксис выражения запроса C # Синтаксис выражения запроса VB
Присоединиться Оператор объединяет две последовательности на основе совпадающих ключей присоединиться… в… на… равно… From x In…, y In… Где xa = ya
GroupJoin Соедините две последовательности и сгруппируйте совпадающие элементы присоединиться… в… на… равно… в… Присоединиться к группе… В… Вкл…

Проекционные операции

Проекция - это операция, при которой объект преобразуется в совершенно новую форму со только определенными свойствами.

Показать примеры

Оператор Описание Синтаксис выражения запроса C # Синтаксис выражения запроса VB
Выбрать Оператор проецирует значения на основе функции преобразования Выбрать Выбрать
SelectMany Оператор проецирует последовательности значений, основанные на функции преобразования, а также объединяет их в единую последовательность. Используйте несколько предложений from Используйте несколько предложений From

Операторы сортировки

Операция сортировки позволяет упорядочить элементы последовательности на основе одного или нескольких атрибутов.

Показать примеры

Оператор Описание Синтаксис выражения запроса C # Синтаксис выражения запроса VB
Сортировать по Оператор сортирует значения в порядке возрастания. Сортировать по Сортировать по
OrderByDescending Оператор сортирует значения в порядке убывания порядокпо ... по убыванию Сортировать по ... По убыванию
Тогда Выполняет вторичную сортировку в порядке возрастания Сортировать по …, … Сортировать по …, …
ThenByDescending Выполняет вторичную сортировку в порядке убывания orderby…,… по убыванию Сортировать по…,… По убыванию
Обеспечить регресс Выполняет обратный порядок элементов в коллекции Непригодный Непригодный

Операторы группировки

Операторы помещают данные в несколько групп на основе общего общего атрибута.

Показать примеры

Оператор Описание Синтаксис выражения запроса C # Синтаксис выражения запроса VB
Группа по Организуйте последовательность элементов в группы и верните их как коллекцию IEnumerable типа IGrouping <key, element> группа… по -или- группа… по… в… Группировать… По… В…
ToLookup Выполните операцию группировки, в которой возвращается последовательность пар ключей Непригодный Непригодный

Конверсии

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

Показать примеры

Оператор Описание Синтаксис выражения запроса C # Синтаксис выражения запроса VB
AsEnumerable Возвращает ввод, набранный как IEnumerable <T> Непригодный Непригодный
AsQueryable (Общий) IEnumerable преобразуется в (общий) IQueryable Непригодный Непригодный
В ролях Выполняет приведение элементов коллекции к указанному типу Используйте явно типизированную переменную диапазона. Например: из строки str в словах От… Как…
OfType Фильтрует значения на основе их, в зависимости от их способности быть приведенным к определенному типу Непригодный Непригодный
ToArray Принудительное выполнение запроса и преобразование коллекции в массив Непригодный Непригодный
ToDictionary На основе ключевого селектора функции набор элементов в Dictionary <TKey, TValue> и принудительное выполнение запроса LINQ. Непригодный Непригодный
Составлять список Принудительное выполнение запроса путем преобразования коллекции в List <T> Непригодный Непригодный
ToLookup Принудительно выполняет запрос и помещает элементы в Lookup <TKey, TElement> на основе функции селектора ключа Непригодный Непригодный

Конкатенация

Выполняет конкатенацию двух последовательностей и очень похож на оператор Union с точки зрения его работы, за исключением того факта, что он не удаляет дубликаты.

Показать примеры

Оператор Описание Синтаксис выражения запроса C # Синтаксис выражения запроса VB
Concat Две последовательности объединяются для образования единой последовательности. Непригодный Непригодный

Агрегация

Выполняет любой тип желаемой агрегации и позволяет создавать настраиваемые агрегаты в LINQ.

Показать примеры

Оператор Описание Синтаксис выражения запроса C # Синтаксис выражения запроса VB
Совокупный Оперирует значениями коллекции для выполнения настраиваемой операции агрегирования. Непригодный Непригодный
В среднем Вычисляется среднее значение набора значений. Непригодный Агрегировать… в… в среднем ()
Считать Подсчитывает элементы, удовлетворяющие функции предиката в коллекции Непригодный Агрегировать… в… в счет ()
LonCount Подсчитывает элементы, удовлетворяющие функции предиката в огромной коллекции Непригодный Агрегировать… в… в LongCount ()
Максимум Узнайте максимальную ценность в коллекции Непригодный Агрегировать… в… в макс. ()
Мин. Узнайте минимальную ценность, существующую в коллекции Непригодный Агрегировать… в… в мин ()
Сумма Узнать сумму значений в коллекции Непригодный Агрегировать… в… в сумму ()

Кванторные операции

Эти операторы возвращают логическое значение, то есть True или False, когда некоторые или все элементы в последовательности удовлетворяют определенному условию.

Показать примеры

Оператор Описание Синтаксис выражения запроса C # Синтаксис выражения запроса VB
Все Возвращает значение True, если все элементы последовательности удовлетворяют условию предиката. Непригодный Агрегировать… в… во все (…)
Любые Путем поиска в последовательности определяет, удовлетворяет ли какой-либо из ее элементов заданному условию. Непригодный Агрегировать… в… в любое ()
Содержит Возвращает значение True, если обнаруживает, что в последовательности присутствует определенный элемент, если последовательность не содержит этот конкретный элемент, возвращается значение false Непригодный Непригодный

Операторы раздела

Разделите входную последовательность на две отдельные части, не переставляя элементы последовательности, а затем возвращая один из них.

Показать примеры

Оператор Описание Синтаксис выражения запроса C # Синтаксис выражения запроса VB
Пропускать Пропускает указанное количество элементов в последовательности и возвращает оставшиеся Непригодный Пропускать
SkipWhile То же, что и для Skip, за исключением того, что количество элементов для пропуска определяется логическим условием Непригодный Пропустить пока
Взять Возьмите указанное количество элементов из последовательности и пропустите оставшиеся Непригодный Взять
TakeWhile То же, что и Take, за исключением того факта, что количество элементов, которые нужно взять, определяется логическим условием Непригодный Взять пока

Генерация операций

Новая последовательность значений создается операторами поколения.

Показать примеры

Оператор Описание Синтаксис выражения запроса C # Синтаксис выражения запроса VB
DefaultIfEmpty При применении к пустой последовательности сгенерировать элемент по умолчанию в последовательности Непригодный Непригодный
Пустой Возвращает пустую последовательность значений и является самым простым оператором генерации. Непригодный Непригодный
Спектр Создает коллекцию, содержащую последовательность целых или числовых значений. Непригодный Непригодный
Повторение Создает последовательность, содержащую повторяющиеся значения определенной длины Непригодный Непригодный

Установить операции

Есть четыре оператора для заданных операций, каждый из которых дает результат на основе разных критериев.

Показать примеры

Оператор Описание Синтаксис выражения запроса C # Синтаксис выражения запроса VB
Отчетливый Создает список уникальных значений из коллекции путем фильтрации повторяющихся данных, если таковые имеются Непригодный Отчетливый
Кроме Сравнивает значения двух коллекций и возвращает те из одной коллекции, которых нет в другой коллекции. Непригодный Непригодный
Пересечение Возвращает набор значений, найденных идентичными в двух отдельных коллекциях. Непригодный Непригодный
Союз Объединяет содержимое двух разных коллекций в один список, который также без дублирования содержимого Непригодный Непригодный

Равенство

Сравнивает два предложения (перечислимых) и определяет, совпадают они точно или нет.

Показать примеры

Оператор Описание Синтаксис выражения запроса C # Синтаксис выражения запроса VB
Последовательность: равно Возвращает логическое значение, если две последовательности оказываются идентичными друг другу. Непригодный Непригодный

Операторы Элементов

За исключением DefaultIfEmpty, все остальные восемь стандартных операторов элементов запроса возвращают один элемент из коллекции.

Показать примеры

Оператор Описание Синтаксис выражения запроса C # Синтаксис выражения запроса VB
ElementAt Возвращает элемент, присутствующий в определенном индексе в коллекции Непригодный Непригодный
ElementAtOrDefault То же, что и ElementAt, за исключением того факта, что он также возвращает значение по умолчанию в случае, если конкретный индекс выходит за пределы допустимого диапазона. Непригодный Непригодный
Первый Извлекает первый элемент в коллекции или первый элемент, удовлетворяющий определенному условию Непригодный Непригодный
FirstOrDefault То же, что и First, за исключением того факта, что он также возвращает значение по умолчанию в случае отсутствия таких элементов. Непригодный Непригодный
Последний Извлекает последний элемент, присутствующий в коллекции, или последний элемент, удовлетворяющий определенному условию Непригодный Непригодный
LastOrDefault То же, что и Last, за исключением того факта, что он также возвращает значение по умолчанию в случае отсутствия любого такого элемента. Непригодный Непригодный
не замужем Возвращает одинокий элемент коллекции или одинокий элемент, удовлетворяющий определенному условию. Непригодный Непригодный
SingleOrDefault То же, что и Single, за исключением того, что он также возвращает значение по умолчанию, если ни один такой одиночный элемент не существует. Непригодный Непригодный
DefaultIfEmpty Возвращает значение по умолчанию, если коллекция или список пустые или нулевые Непригодный Непригодный

LINQ to SQL предлагает инфраструктуру (среду выполнения) для управления реляционными данными как объектами. Это компонент .NET Framework версии 3.5, он умеет переводить интегрированные в язык запросы объектной модели в SQL. Затем эти запросы отправляются в базу данных для выполнения. После получения результатов из базы данных LINQ to SQL снова преобразует их в объекты.

Введение в LINQ To SQL

Для большинства разработчиков ASP.NET LINQ to SQL (также известный как DLINQ) является привлекательной частью Language Integrated Query, поскольку он позволяет запрашивать данные в базе данных SQL-сервера с использованием обычных выражений LINQ. Он также позволяет обновлять, удалять и вставлять данные, но единственным недостатком, которым он страдает, является его ограничение базой данных SQL-сервера. Однако у LINQ to SQL есть много преимуществ перед ADO.NET, например, снижение сложности, несколько строк кода и многое другое.

Ниже приведена диаграмма, показывающая архитектуру выполнения LINQ to SQL.

Как использовать LINQ to SQL?

Step 1- Установите новое «соединение данных» с сервером базы данных. Просмотреть & arrar; Server Explorer & arrar; Подключения к данным & arrar; Добавить соединение

Step 2 - Добавить файл класса LINQ To SQL

Step 3 - Выберите таблицы из базы данных и перетащите их в новый файл класса LINQ to SQL.

Step 4 - Добавлены таблицы в файл класса.

Запросы с LINQ to SQL

Правила выполнения запроса с помощью LINQ to SQL аналогичны правилам стандартного запроса LINQ, то есть запрос выполняется либо отложенно, либо немедленно. Существуют различные компоненты, которые играют роль в выполнении запроса с LINQ to SQL, и это следующие.

  • LINQ to SQL API - запрашивает выполнение запроса от имени приложения и отправляет его поставщику LINQ to SQL.

  • LINQ to SQL Provider - преобразует запрос в Transact SQL (T-SQL) и отправляет новый запрос поставщику ADO для выполнения.

  • ADO Provider - После выполнения запроса отправьте результаты в форме DataReader поставщику LINQ to SQL, который, в свою очередь, преобразует их в форму объекта пользователя.

Следует отметить, что перед выполнением запроса LINQ to SQL необходимо подключиться к источнику данных через класс DataContext.

Вставка, обновление и удаление с помощью LINQ To SQL

Добавить ИЛИ Вставить

C#

using System;
using System.Linq;

namespace LINQtoSQL {
   class LinqToSQLCRUD {
      static void Main(string[] args) {
      
         string connectString = System.Configuration.ConfigurationManager.ConnectionStrings["LinqToSQLDBConnectionString"].ToString();

         LinqToSQLDataContext db = new LinqToSQLDataContext(connectString);           

         //Create new Employee
		 
         Employee newEmployee = new Employee();
         newEmployee.Name = "Michael";
         newEmployee.Email = "[email protected]";
         newEmployee.ContactNo = "343434343";
         newEmployee.DepartmentId = 3;
         newEmployee.Address = "Michael - USA";

         //Add new Employee to database
         db.Employees.InsertOnSubmit(newEmployee);

         //Save changes to Database.
         db.SubmitChanges();

         //Get new Inserted Employee            
         Employee insertedEmployee = db.Employees.FirstOrDefault(e ⇒e.Name.Equals("Michael"));

         Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3}, Address = {4}",
                          insertedEmployee.EmployeeId, insertedEmployee.Name, insertedEmployee.Email, 
                          insertedEmployee.ContactNo, insertedEmployee.Address);

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

VB

Module Module1

   Sub Main()
   
      Dim connectString As String = System.Configuration.ConfigurationManager.ConnectionStrings("LinqToSQLDBConnectionString").ToString()

      Dim db As New LinqToSQLDataContext(connectString)

      Dim newEmployee As New Employee()
	  
      newEmployee.Name = "Michael"
      newEmployee.Email = "[email protected]"
      newEmployee.ContactNo = "343434343"
      newEmployee.DepartmentId = 3
      newEmployee.Address = "Michael - USA"
     
      db.Employees.InsertOnSubmit(newEmployee)
     
      db.SubmitChanges()
     
      Dim insertedEmployee As Employee = db.Employees.FirstOrDefault(Function(e) e.Name.Equals("Michael"))

      Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3}, 
         Address = {4}", insertedEmployee.EmployeeId, insertedEmployee.Name,
         insertedEmployee.Email, insertedEmployee.ContactNo, insertedEmployee.Address)

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()
	 
   End Sub
  
End Module

Когда приведенный выше код C # или VB компилируется и запускается, он дает следующий результат:

Emplyee ID = 4, Name = Michael, Email = [email protected], ContactNo = 
343434343, Address = Michael - USA

Press any key to continue.

Обновить

C#

using System;
using System.Linq;

namespace LINQtoSQL {
   class LinqToSQLCRUD {
      static void Main(string[] args) {
      
         string connectString = System.Configuration.ConfigurationManager.ConnectionStrings["LinqToSQLDBConnectionString"].ToString();

         LinqToSQLDataContext db = new LinqToSQLDataContext(connectString);

         //Get Employee for update
         Employee employee = db.Employees.FirstOrDefault(e =>e.Name.Equals("Michael"));

         employee.Name = "George Michael";
         employee.Email = "[email protected]";
         employee.ContactNo = "99999999";
         employee.DepartmentId = 2;
         employee.Address = "Michael George - UK";

         //Save changes to Database.
         db.SubmitChanges();

         //Get Updated Employee            
         Employee updatedEmployee = db.Employees.FirstOrDefault(e ⇒e.Name.Equals("George Michael"));

         Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3}, Address = {4}",
                          updatedEmployee.EmployeeId, updatedEmployee.Name, updatedEmployee.Email, 
                          updatedEmployee.ContactNo, updatedEmployee.Address);

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

VB

Module Module1

   Sub Main()
  
      Dim connectString As String = System.Configuration.ConfigurationManager.ConnectionStrings("LinqToSQLDBConnectionString").ToString()

      Dim db As New LinqToSQLDataContext(connectString)

      Dim employee As Employee = db.Employees.FirstOrDefault(Function(e) e.Name.Equals("Michael"))

      employee.Name = "George Michael"
      employee.Email = "[email protected]"
      employee.ContactNo = "99999999"
      employee.DepartmentId = 2
      employee.Address = "Michael George - UK"

      db.SubmitChanges()
          
      Dim updatedEmployee As Employee = db.Employees.FirstOrDefault(Function(e) e.Name.Equals("George Michael"))

      Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3},
         Address = {4}", updatedEmployee.EmployeeId, updatedEmployee.Name, 
         updatedEmployee.Email, updatedEmployee.ContactNo, updatedEmployee.Address)

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()
	  
   End Sub
   
End Module

Когда приведенный выше код C # или Vb компилируется и запускается, он дает следующий результат:

Emplyee ID = 4, Name = George Michael, Email = [email protected], ContactNo = 
999999999, Address = Michael George - UK

Press any key to continue.

удалять

C#

using System;
using System.Linq;

namespace LINQtoSQL {
   class LinqToSQLCRUD {
      static void Main(string[] args) {
      
         string connectString = System.Configuration.ConfigurationManager.ConnectionStrings["LinqToSQLDBConnectionString"].ToString();

         LinqToSQLDataContext db = newLinqToSQLDataContext(connectString);

         //Get Employee to Delete
         Employee deleteEmployee = db.Employees.FirstOrDefault(e ⇒e.Name.Equals("George Michael"));

         //Delete Employee
         db.Employees.DeleteOnSubmit(deleteEmployee);

         //Save changes to Database.
         db.SubmitChanges();

         //Get All Employee from Database
         var employeeList = db.Employees;
         foreach (Employee employee in employeeList) {
            Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3}",
               employee.EmployeeId, employee.Name, employee.Email, employee.ContactNo);
         }            

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

VB

Module Module1

   Sub Main()
   
      Dim connectString As String = System.Configuration.ConfigurationManager.ConnectionStrings("LinqToSQLDBConnectionString").ToString()

      Dim db As New LinqToSQLDataContext(connectString)

      Dim deleteEmployee As Employee = db.Employees.FirstOrDefault(Function(e) e.Name.Equals("George Michael"))

      db.Employees.DeleteOnSubmit(deleteEmployee)

      db.SubmitChanges()

      Dim employeeList = db.Employees
	  
      For Each employee As Employee In employeeList
         Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3}",
            employee.EmployeeId, employee.Name, employee.Email, employee.ContactNo)
      Next 

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()
   End Sub
   
End Module

Когда приведенный выше код C # или VB компилируется и запускается, он дает следующий результат:

Emplyee ID = 1, Name = William, Email = [email protected], ContactNo = 999999999
Emplyee ID = 2, Name = Miley, Email = [email protected], ContactNo = 999999999
Emplyee ID = 3, Name = Benjamin, Email = [email protected], ContactNo = 

Press any key to continue.

LINQ to Objects предлагает использование любого запроса LINQ, поддерживающего IEnumerable <T>, для доступа к коллекциям данных в памяти без необходимости использования поставщика LINQ (API), как в случае LINQ to SQL или LINQ to XML.

Введение в LINQ to Objects

Запросы в LINQ to Objects возвращают переменные типа обычно только IEnumerable <T>. Короче говоря, LINQ to Objects предлагает свежий подход к коллекциям, поскольку раньше было жизненно важно написать длинное кодирование (циклы foreach большой сложности) для извлечения данных из коллекции, которая теперь заменяется написанием декларативного кода, который четко описывает желаемые данные что требуется для получения.

LINQ to Objects имеет также множество преимуществ перед традиционными циклами foreach, например, более удобочитаемость, мощная фильтрация, возможность группировки, улучшенное упорядочение с минимальным кодированием приложения. Такие запросы LINQ также более компактны по своей природе и переносимы в любые другие источники данных без каких-либо изменений или с небольшими изменениями.

Ниже приведен простой пример LINQ to Objects -

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LINQtoObjects {
   class Program {
      static void Main(string[] args) {
      
         string[] tools = { "Tablesaw", "Bandsaw", "Planer", "Jointer", "Drill", "Sander" };
         var list = from t in tools select t;

         StringBuilder sb = new StringBuilder();

         foreach (string s in list) {
            sb.Append(s + Environment.NewLine);
         }
		 
         Console.WriteLine(sb.ToString(), "Tools");
         Console.ReadLine();
      }
   }
}

В этом примере массив строк (инструментов) используется в качестве коллекции объектов, которые необходимо запросить с помощью LINQ to Objects.

Objects query is:
var list = from t in tools select t;

Когда приведенный выше код компилируется и выполняется, он дает следующий результат:

Tablesaw
Bandsaw
Planer
Jointer
Drill
Sander

Запросы в коллекциях памяти с использованием LINQ to Objects

C #

using System;
using System.Collections.Generic;
using System.Linq;

namespace LINQtoObjects {
   class Department {
      public int DepartmentId { get; set; }
      public string Name { get; set; }
   }

   class LinqToObjects {
      static void Main(string[] args) {
      
         List<Department> departments = new List<Department>();
			
         departments.Add(new Department { DepartmentId = 1, Name = "Account" });
         departments.Add(new Department { DepartmentId = 2, Name = "Sales" });
         departments.Add(new Department { DepartmentId = 3, Name = "Marketing" });

         var departmentList = from d in departments
                              select d;

         foreach (var dept in departmentList) {
            Console.WriteLine("Department Id = {0} , Department Name = {1}",
               dept.DepartmentId, dept.Name);
         }
		 
         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

VB

Imports System.Collections.Generic
Imports System.Linq

Module Module1

   Sub Main(ByVal args As String())

      Dim account As New Department With {.Name = "Account", .DepartmentId = 1}
      Dim sales As New Department With {.Name = "Sales", .DepartmentId = 2}
      Dim marketing As New Department With {.Name = "Marketing", .DepartmentId = 3}

      Dim departments As New System.Collections.Generic.List(Of Department)(New Department() {account, sales, marketing})

      Dim departmentList = From d In departments

      For Each dept In departmentList
         Console.WriteLine("Department Id = {0} , Department Name = {1}", dept.DepartmentId, dept.Name)
      Next

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()
   End Sub

   Class Department
      Public Property Name As String
      Public Property DepartmentId As Integer
   End Class
   
End Module

Когда приведенный выше код C # или VB компилируется и выполняется, он дает следующий результат:

Department Id = 1, Department Name = Account
Department Id = 2, Department Name = Sales
Department Id = 3, Department Name = Marketing

Press any key to continue.

Набор данных предлагает чрезвычайно полезное представление данных в памяти и используется для различных приложений на основе данных. LINQ to Dataset как одна из технологий LINQ to ADO.NET упрощает выполнение запросов к данным набора данных и повышает производительность.

Введение LINQ To Dataset

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

Ниже приведен простой пример запроса LINQ to Dataset, в котором сначала получается источник данных, а затем набор данных заполняется двумя таблицами данных. Между обеими таблицами устанавливается связь, и для обеих таблиц создается запрос LINQ с помощью предложения соединения. Наконец, цикл foreach используется для отображения желаемых результатов.

C #

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LINQtoDataset {
   class Program {
      static void Main(string[] args) {
      
         string connectString = System.Configuration.ConfigurationManager.ConnectionStrings["LinqToSQLDBConnectionString"].ToString();

         string sqlSelect = "SELECT * FROM Department;" + "SELECT * FROM Employee;";

         // Create the data adapter to retrieve data from the database
         SqlDataAdapter da = new SqlDataAdapter(sqlSelect, connectString);
        
         // Create table mappings
         da.TableMappings.Add("Table", "Department");
         da.TableMappings.Add("Table1", "Employee");

         // Create and fill the DataSet
         DataSet ds = new DataSet();
         da.Fill(ds);

         DataRelation dr = ds.Relations.Add("FK_Employee_Department",
                           ds.Tables["Department"].Columns["DepartmentId"],
                           ds.Tables["Employee"].Columns["DepartmentId"]);

         DataTable department = ds.Tables["Department"];
         DataTable employee = ds.Tables["Employee"];

         var query = from d in department.AsEnumerable()
                     join e in employee.AsEnumerable()
                     on d.Field<int>("DepartmentId") equals
                     e.Field<int>("DepartmentId")                        
                     select new {
                        EmployeeId = e.Field<int>("EmployeeId"),
                        Name = e.Field<string>("Name"),                            
                        DepartmentId = d.Field<int>("DepartmentId"),                            
                        DepartmentName = d.Field<string>("Name")
                     };

         foreach (var q in query) {
            Console.WriteLine("Employee Id = {0} , Name = {1} , Department Name = {2}",
               q.EmployeeId, q.Name, q.DepartmentName);
         }

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

VB

Imports System.Data.SqlClient
Imports System.Linq

Module LinqToDataSet

   Sub Main()
   
      Dim connectString As String = System.Configuration.ConfigurationManager.ConnectionStrings("LinqToSQLDBConnectionString").ToString()

      Dim sqlSelect As String = "SELECT * FROM Department;" + "SELECT * FROM Employee;"
      Dim sqlCnn As SqlConnection = New SqlConnection(connectString)
      sqlCnn.Open()

      Dim da As New SqlDataAdapter
      da.SelectCommand = New SqlCommand(sqlSelect, sqlCnn)

      da.TableMappings.Add("Table", "Department")
      da.TableMappings.Add("Table1", "Employee")

      Dim ds As New DataSet()
      da.Fill(ds)

      Dim dr As DataRelation = ds.Relations.Add("FK_Employee_Department", ds.Tables("Department").Columns("DepartmentId"), ds.Tables("Employee").Columns("DepartmentId"))

      Dim department As DataTable = ds.Tables("Department")
      Dim employee As DataTable = ds.Tables("Employee")

      Dim query = From d In department.AsEnumerable()
                  Join e In employee.AsEnumerable() On d.Field(Of Integer)("DepartmentId") Equals
                  e.Field(Of Integer)("DepartmentId")
                  Select New Person With { _
                        .EmployeeId = e.Field(Of Integer)("EmployeeId"),
                        .EmployeeName = e.Field(Of String)("Name"),
                        .DepartmentId = d.Field(Of Integer)("DepartmentId"),
                        .DepartmentName = d.Field(Of String)("Name")
                  }

      For Each e In query
         Console.WriteLine("Employee Id = {0} , Name = {1} , Department Name = {2}", e.EmployeeId, e.EmployeeName, e.DepartmentName)
      Next

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()
	  
   End Sub
  
   Class Person
      Public Property EmployeeId As Integer
      Public Property EmployeeName As String
      Public Property DepartmentId As Integer
      Public Property DepartmentName As String
   End Class
   
End Module

Когда приведенный выше код C # или VB компилируется и выполняется, он дает следующий результат:

Employee Id = 1, Name = William, Department Name = Account
Employee Id = 2, Name = Benjamin, Department Name = Account
Employee Id = 3, Name = Miley, Department Name = Sales

Press any key to continue.

Запрос набора данных с помощью LinQ to Dataset

Перед тем, как начать запрашивать набор данных с помощью LINQ to Dataset, жизненно важно загрузить данные в набор данных, и это выполняется либо с помощью класса DataAdapter, либо с помощью LINQ to SQL. Формулирование запросов с использованием LINQ to Dataset очень похоже на формулирование запросов с использованием LINQ вместе с другими источниками данных с поддержкой LINQ.

Однотабличный запрос

В следующем запросе с одной таблицей все онлайн-заказы собираются из таблицы SalesOrderHeaderTtable, а затем в качестве вывода отображаются идентификатор заказа, дата заказа, а также номер заказа.

C#

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LinqToDataset {
   class SingleTable {
      static void Main(string[] args) {
      
         string connectString = System.Configuration.ConfigurationManager.ConnectionStrings["LinqToSQLDBConnectionString"].ToString();

         string sqlSelect = "SELECT * FROM Department;";

         // Create the data adapter to retrieve data from the database
         SqlDataAdapter da = new SqlDataAdapter(sqlSelect, connectString);

         // Create table mappings
         da.TableMappings.Add("Table", "Department");           

         // Create and fill the DataSet
         DataSet ds = new DataSet();
         da.Fill(ds);

         DataTable department = ds.Tables["Department"];            

         var query = from d in department.AsEnumerable()                        
         select new {
            DepartmentId = d.Field<int>("DepartmentId"),
            DepartmentName = d.Field<string>("Name")
         };

         foreach (var q in query) {
            Console.WriteLine("Department Id = {0} , Name = {1}",
               q.DepartmentId, q.DepartmentName);
         }

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

VB

Imports System.Data.SqlClient
Imports System.Linq

Module LinqToDataSet

   Sub Main()
   
      Dim connectString As String = System.Configuration.ConfigurationManager.ConnectionStrings("LinqToSQLDBConnectionString").ToString()

      Dim sqlSelect As String = "SELECT * FROM Department;"
      Dim sqlCnn As SqlConnection = New SqlConnection(connectString)
      sqlCnn.Open()

      Dim da As New SqlDataAdapter
      da.SelectCommand = New SqlCommand(sqlSelect, sqlCnn)

      da.TableMappings.Add("Table", "Department")
      Dim ds As New DataSet()
      da.Fill(ds)

      Dim department As DataTable = ds.Tables("Department")

      Dim query = From d In department.AsEnumerable()
      Select New DepartmentDetail With {
         .DepartmentId = d.Field(Of Integer)("DepartmentId"),
            .DepartmentName = d.Field(Of String)("Name")
      }

      For Each e In query
         Console.WriteLine("Department Id = {0} , Name = {1}", e.DepartmentId, e.DepartmentName)
      Next

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()
   End Sub

   Public Class DepartmentDetail
      Public Property DepartmentId As Integer
      Public Property DepartmentName As String
   End Class
   
End Module

Когда приведенный выше код C # или VB компилируется и выполняется, он дает следующий результат:

Department Id = 1, Name = Account
Department Id = 2, Name = Sales
Department Id = 3, Name = Pre-Sales
Department Id = 4, Name = Marketing

Press any key to continue.

LINQ to XML обеспечивает легкий доступ ко всем функциям LINQ, таким как стандартные операторы запросов, программный интерфейс и т. Д. Интегрированный в платформу .NET, LINQ to XML также наилучшим образом использует такие функции платформы .NET, как отладка, проверка во время компиляции, строгая типизация. и многое другое.

Введение в LINQ to XML

При использовании LINQ to XML загружать XML-документы в память очень просто, а проще запрашивать и изменять документы. Также возможно сохранять XML-документы, существующие в памяти, на диск и сериализовать их. Это избавляет разработчика от необходимости изучать язык запросов XML, который является довольно сложным.

LINQ to XML имеет свои возможности в пространстве имен System.Xml.Linq. В нем есть все 19 классов, необходимых для работы с XML. Эти классы следующие.

  • XAttribute
  • XCData
  • XComment
  • XContainer
  • XDeclaration
  • XDocument
  • XDocumentType
  • XElement
  • XName
  • XNamespace
  • XNode
  • XNodeDocumentOrderComparer
  • XNodeEqualityComparer
  • XObject
  • XObjectChange
  • XObjectChangeEventArgs
  • XObjectEventHandler
  • XProcessingInstruction
  • XText

Прочтите XML-файл с помощью LINQ

C #

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

namespace LINQtoXML {
   class ExampleOfXML {
      static void Main(string[] args) {
      
         string myXML = @"<Departments>
                       <Department>Account</Department>
                       <Department>Sales</Department>
                       <Department>Pre-Sales</Department>
                       <Department>Marketing</Department>
                       </Departments>";

         XDocument xdoc = new XDocument();
         xdoc = XDocument.Parse(myXML);

         var result = xdoc.Element("Departments").Descendants();

         foreach (XElement item in result) {
            Console.WriteLine("Department Name - " + item.Value);
         }

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

VB

Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml.Linq

Module Module1

   Sub Main(ByVal args As String())
   
      Dim myXML As String = "<Departments>" & vbCr & vbLf & 
                           "<Department>Account</Department>" & vbCr & vbLf & 
                           "<Department>Sales</Department>" & vbCr & vbLf & 
                           "<Department>Pre-Sales</Department>" & vbCr & vbLf & 
                           "<Department>Marketing</Department>" & vbCr & vbLf & 
                           "</Departments>"

      Dim xdoc As New XDocument()
      xdoc = XDocument.Parse(myXML)

      Dim result = xdoc.Element("Departments").Descendants()

      For Each item As XElement In result
         Console.WriteLine("Department Name - " + item.Value)
      Next

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()
	  
   End Sub
   
End Module

Когда приведенный выше код C # или VB компилируется и выполняется, он дает следующий результат:

Department Name - Account
Department Name - Sales
Department Name - Pre-Sales
Department Name - Marketing

Press any key to continue.

Добавить новый узел

C #

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

namespace LINQtoXML {
   class ExampleOfXML {
      static void Main(string[] args) {
      
         string myXML = @"<Departments>
                       <Department>Account</Department>
                       <Department>Sales</Department>
                       <Department>Pre-Sales</Department>
                       <Department>Marketing</Department>
                       </Departments>";

         XDocument xdoc = new XDocument();
         xdoc = XDocument.Parse(myXML);

         //Add new Element
         xdoc.Element("Departments").Add(new XElement("Department", "Finance"));

         //Add new Element at First
         xdoc.Element("Departments").AddFirst(new XElement("Department", "Support"));

         var result = xdoc.Element("Departments").Descendants();

         foreach (XElement item in result) {
            Console.WriteLine("Department Name - " + item.Value);
         }

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

VB

Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml.Linq

Module Module1

   Sub Main(ByVal args As String())
   
      Dim myXML As String = "<Departments>" & vbCr & vbLf & 
     	                   "<Department>Account</Department>" & vbCr & vbLf & 
     	                   "<Department>Sales</Department>" & vbCr & vbLf & 
     	                   "<Department>Pre-Sales</Department>" & vbCr & vbLf & 
     	                   "<Department>Marketing</Department>" & vbCr & vbLf & 
     	                   "</Departments>"

      Dim xdoc As New XDocument()
      xdoc = XDocument.Parse(myXML)

      xdoc.Element("Departments").Add(New XElement("Department", "Finance"))
     
      xdoc.Element("Departments").AddFirst(New XElement("Department", "Support"))

      Dim result = xdoc.Element("Departments").Descendants()

      For Each item As XElement In result
         Console.WriteLine("Department Name - " + item.Value)
      Next

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()
	  
   End Sub
   
End Module

Когда приведенный выше код C # или VB компилируется и выполняется, он дает следующий результат:

Department Name - Support
Department Name - Account
Department Name - Sales
Department Name - Pre-Sales
Department Name - Marketing
Department Name - Finance

Press any key to continue.

Удаление определенного узла

C #

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

namespace LINQtoXML {
   class ExampleOfXML {
      static void Main(string[] args) {
      
         string myXML = @"<Departments>
                       <Department>Support</Department>
                       <Department>Account</Department>
                       <Department>Sales</Department>
                       <Department>Pre-Sales</Department>
                       <Department>Marketing</Department>
                       <Department>Finance</Department>
                       </Departments>";

         XDocument xdoc = new XDocument();
         xdoc = XDocument.Parse(myXML);

         //Remove Sales Department
         xdoc.Descendants().Where(s =>s.Value == "Sales").Remove(); 

         var result = xdoc.Element("Departments").Descendants();

         foreach (XElement item in result) {
            Console.WriteLine("Department Name - " + item.Value);
         }

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

VB

Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml.Linq

Module Module1

   Sub Main(args As String())
   
      Dim myXML As String = "<Departments>" & vbCr & vbLf & 
     	                   "<Department>Support</Department>" & vbCr & vbLf & 
     	                   "<Department>Account</Department>" & vbCr & vbLf & 
     	                   "<Department>Sales</Department>" & vbCr & vbLf & 
     	                   "<Department>Pre-Sales</Department>" & vbCr & vbLf & 
     	                   "<Department>Marketing</Department>" & vbCr & vbLf & 
     	                   "<Department>Finance</Department>" & vbCr & vbLf & 
                           "</Departments>"

      Dim xdoc As New XDocument()
      xdoc = XDocument.Parse(myXML)
     
      xdoc.Descendants().Where(Function(s) s.Value = "Sales").Remove()

      Dim result = xdoc.Element("Departments").Descendants()

      For Each item As XElement In result
         Console.WriteLine("Department Name - " + item.Value)
      Next

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()
	  
   End Sub
   
End Module

Когда приведенный выше код C # или VB компилируется и выполняется, он дает следующий результат:

Department Name - Support
Department Name - Account
Department Name - Pre-Sales
Department Name - Marketing
Department Name - Finance

Press any key to continue.

Являясь частью ADO.NET Entity Framework, LINQ to Entities более гибок, чем LINQ to SQL, но не пользуется большой популярностью из-за своей сложности и отсутствия ключевых функций. Однако он не имеет ограничений LINQ to SQL, которые позволяют запрашивать данные только в базе данных SQL-сервера, поскольку LINQ to Entities облегчает запрос данных в большом количестве поставщиков данных, таких как Oracle, MySQL и т. Д.

Более того, он получил серьезную поддержку со стороны ASP.Net в том смысле, что пользователи могут использовать элемент управления источником данных для выполнения запроса через LINQ to Entities и упрощает привязку результатов без необходимости дополнительного кодирования.

Благодаря этим преимуществам LINQ to Entities стал в настоящее время стандартным механизмом использования LINQ в базах данных. LINQ to Entities также позволяет легко изменять детали запрашиваемых данных и выполнять пакетное обновление. Самым интригующим фактом в LINQ to Entities является то, что он имеет тот же синтаксис, что и SQL, и даже имеет ту же группу стандартных операторов запросов, таких как Join, Select, OrderBy и т. Д.

Процесс создания и выполнения запросов LINQ to Entities

  • Строительство ObjectQuery экземпляр из ObjectContext (Подключение сущности)

  • Составление запроса на C # или Visual Basic (VB) с использованием вновь созданного экземпляра

  • Преобразование стандартных операторов запросов LINQ, а также выражений LINQ в деревья команд

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

  • Возвращение клиенту всех результатов запроса

ObjectContext это основной класс, который позволяет взаимодействовать с Entity Data Modelили, другими словами, действует как мост, соединяющий LINQ с базой данных. Деревья команд - это представление запроса, совместимое с платформой Entity.

Entity Framework, с другой стороны, на самом деле Object Relational Mapperобычно сокращенно ORM разработчиками, который генерирует бизнес-объекты, а также сущности в соответствии с таблицами базы данных и облегчает различные базовые операции, такие как создание, обновление, удаление и чтение. На следующем рисунке показана структура сущности и ее компоненты.

Пример ADD, UPDATE и DELETE с использованием LINQ с Entity Model

Сначала добавьте модель сущности, выполнив следующие шаги.

Step 1- Щелкните правой кнопкой мыши проект и нажмите «Добавить новый элемент», чтобы открыть окно, как показано ниже. Выберите модель данных сущности ADO.NET, укажите имя и нажмите Добавить.

Step 2 - Выбрать Generate from database.

Step 3 - Выберите «Подключение к базе данных» в раскрывающемся меню.

Step 4 - Выберите все таблицы.

Теперь напишите следующий код.

using DataAccess;
using System;
using System.Linq;

namespace LINQTOSQLConsoleApp {
   public class LinqToEntityModel {
      static void Main(string[] args) {

         using (LinqToSQLDBEntities context = new LinqToSQLDBEntities()) {
            //Get the List of Departments from Database
            var departmentList = from d in context.Departments
            select d;

            foreach (var dept in departmentList) {
               Console.WriteLine("Department Id = {0} , Department Name = {1}",
                  dept.DepartmentId, dept.Name);
            }

            //Add new Department
            DataAccess.Department department = new DataAccess.Department();
            department.Name = "Support";

            context.Departments.Add(department);
            context.SaveChanges();

            Console.WriteLine("Department Name = Support is inserted in Database");

            //Update existing Department
            DataAccess.Department updateDepartment = context.Departments.FirstOrDefault(d ⇒d.DepartmentId == 1);
            updateDepartment.Name = "Account updated";
            context.SaveChanges();

            Console.WriteLine("Department Name = Account is updated in Database");

            //Delete existing Department
            DataAccess.Department deleteDepartment = context.Departments.FirstOrDefault(d ⇒d.DepartmentId == 3);
            context.Departments.Remove(deleteDepartment);
            context.SaveChanges();

            Console.WriteLine("Department Name = Pre-Sales is deleted in Database");

            //Get the Updated List of Departments from Database
            departmentList = from d in context.Departments
            select d;

            foreach (var dept in departmentList) {
               Console.WriteLine("Department Id = {0} , Department Name = {1}",
                  dept.DepartmentId, dept.Name);
            }
         }

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат:

Термин «лямбда-выражение» получил свое название от «лямбда-исчисления», которое, в свою очередь, является математической нотацией, применяемой для определения функций. Лямбда-выражения как исполняемая часть уравнения LINQ транслируют логику таким образом, чтобы ее можно было удобно передать источнику данных. Однако лямбда-выражения не ограничиваются поиском применения только в LINQ.

Эти выражения выражаются следующим синтаксисом -

(Input parameters) ⇒ Expression or statement block

Вот пример лямбда-выражения -

у ⇒ у * у

Вышеприведенное выражение определяет параметр с именем y, и это значение y возводится в квадрат. Однако в этой форме невозможно выполнить лямбда-выражение. Пример лямбда-выражения в C # показан ниже.

C #

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace lambdaexample {
   class Program {

      delegate int del(int i);
      static void Main(string[] args) {

         del myDelegate = y ⇒ y * y;
         int j = myDelegate(5);
         Console.WriteLine(j);
         Console.ReadLine();
      }
   }
}

VB

Module Module1
   Private Delegate Function del(ByVal i As Integer) As Integer
   
   Sub Main(ByVal args As String())
   
      Dim myDelegate As del = Function(y) y * y
      Dim j As Integer = myDelegate(5)
      Console.WriteLine(j)
      Console.ReadLine()
	  
   End Sub
   
End Module

Когда приведенный выше код C # или VB компилируется и выполняется, он дает следующий результат:

25

Выражение Лямбда

Поскольку выражение в синтаксисе лямбда-выражения, показанного выше, находится справа, оно также известно как выражение лямбда.

Асинхронные лямбды

Лямбда-выражение, созданное путем включения асинхронной обработки с использованием ключевого слова async, известно как async lambdas. Ниже приведен пример асинхронной лямбды.

Func<Task<string>> getWordAsync = async()⇒ “hello”;

Лямбда в стандартных операторах запросов

Лямбда-выражение в операторе запроса оценивается тем же оператором по запросу и постоянно работает с каждым из элементов входной последовательности, а не со всей последовательностью. Лямбда-выражение позволяет разработчикам вводить собственную логику в стандартные операторы запросов. В приведенном ниже примере разработчик использовал оператор «Где» для восстановления нечетных значений из заданного списка с помощью лямбда-выражения.

C #

//Get the average of the odd Fibonacci numbers in the series... 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace lambdaexample {
   class Program {     
      static void Main(string[] args) {
      
         int[] fibNum = { 1, 1, 2, 3, 5, 8, 13, 21, 34 };
         double averageValue = fibNum.Where(num ⇒ num % 2 == 1).Average();
         Console.WriteLine(averageValue);
         Console.ReadLine();
      }
   }
}

VB

Module Module1

   Sub Main()
   
      Dim fibNum As Integer() = {1, 1, 2, 3, 5, 8, 13, 21, 34}
      Dim averageValue As Double = fibNum.Where(Function(num) num Mod 2 = 1).Average()
	  
      Console.WriteLine(averageValue)
      Console.ReadLine()
	  
   End Sub
   
End Module

Когда приведенный выше код компилируется и выполняется, он дает следующий результат:

7.33333333333333

Вывод типа в лямбде

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

delegate int Transformer (int i);

Здесь компилятор использует вывод типа, чтобы использовать тот факт, что x является целым числом, и это делается путем проверки типа параметра преобразователя.

Область действия переменной в лямбда-выражении

Существуют некоторые правила при использовании области видимости переменных в лямбда-выражении, например, переменные, инициированные в лямбда-выражении, не должны быть видимыми во внешнем методе. Также существует правило, согласно которому захваченная переменная не подлежит сборке мусора, если делегат, ссылающийся на нее, не получит право на сборку мусора. Более того, есть правило, запрещающее оператору return в лямбда-выражении вызывать возврат включающего метода.

Вот пример, демонстрирующий область видимости переменной в лямбда-выражении.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace lambdaexample {
   class Program {
      delegate bool D();
      delegate bool D2(int i);

      class Test {
         D del;
         D2 del2;
			
         public void TestMethod(int input) {
            int j = 0;
            // Initialize the delegates with lambda expressions.
            // Note access to 2 outer variables.
            // del will be invoked within this method.
            del = () ⇒ { j = 10; return j > input; };

            // del2 will be invoked after TestMethod goes out of scope.
            del2 = (x) ⇒ { return x == j; };

            // Demonstrate value of j:            
            // The delegate has not been invoked yet.
            Console.WriteLine("j = {0}", j);        // Invoke the delegate.
            bool boolResult = del();
           
            Console.WriteLine("j = {0}. b = {1}", j, boolResult);
         }

         static void Main() {
            Test test = new Test();
            test.TestMethod(5);

            // Prove that del2 still has a copy of
            // local variable j from TestMethod.
            bool result = test.del2(10);
           
            Console.WriteLine(result);

            Console.ReadKey();
         }
      }
   }
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат:

j = 0
j = 10. b = True
True

Дерево выражений

Лямбда-выражения используются в Expression Treeстроительство широко. Дерево выражений выдает код в структуре данных, напоминающей дерево, в котором каждый узел сам по себе является выражением, таким как вызов метода, или может быть бинарной операцией, например x <y. Ниже приведен пример использования лямбда-выражения для построения дерева выражений.

Заявление Лямбда

Есть также statement lambdasсостоящий из двух или трех операторов, но не используются при построении деревьев выражений. Оператор возврата должен быть записан в лямбда-выражении оператора.

Синтаксис выражения лямбда

(params)⇒ {statements}

Пример выражения лямбда

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;

namespace lambdaexample {
   class Program {
      static void Main(string[] args) {
         int[] source = new[] { 3, 8, 4, 6, 1, 7, 9, 2, 4, 8 };

         foreach (int i in source.Where(x ⇒ 
            {
               if (x <= 3)
                  return true;
               else if (x >= 7)
                  return true;
               return false;
            }
         ))
        Console.WriteLine(i);
        Console.ReadLine();
      }
   }
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат:

3
8
1
7
9
2
8

Лямбда-выражения используются в качестве аргументов в запросах LINQ на основе методов и никогда не могут находиться в левой части таких операторов, как is или же asточно так же, как анонимные методы. Хотя лямбда-выражения во многом похожи на анонимные методы, их использование не ограничивается только делегатами.

Что следует помнить при использовании лямбда-выражений

  • Лямбда-выражение может возвращать значение и иметь параметры.

  • Параметры могут быть определены множеством способов с помощью лямбда-выражения.

  • Если в лямбда-выражении есть один оператор, фигурные скобки не нужны, тогда как при наличии нескольких операторов фигурные скобки, а также возвращаемое значение необходимы для записи.

  • С помощью лямбда-выражений можно получить доступ к переменным, присутствующим вне блока лямбда-выражения, с помощью функции, известной как замыкание. Закрытие следует использовать осторожно, чтобы избежать каких-либо проблем.

  • Невозможно выполнить небезопасный код внутри любого лямбда-выражения.

  • Лямбда-выражения не предназначены для использования в левой части оператора.

Как набор расширений платформы .NET, LINQ является предпочтительным механизмом доступа к данным для разработчиков ASP.NET. ASP.NET 3.5 имеет встроенный инструмент управления LINQDataSource, который позволяет легко использовать LINQ в ASP.NET. ASP.NET использует вышеупомянутый элемент управления в качестве источника данных. Реальные проекты в основном охватывают веб-сайты или приложения Windows, поэтому, чтобы лучше понять концепцию LINQ с ASP.NET, давайте начнем с создания веб-сайта ASP.NET, который использует функции LINQ.

Для этого необходимо, чтобы в вашей системе были установлены Visual Studio и .NET framework. После того, как вы открыли Visual Studio, перейдите в Файл → Создать → Веб-сайт. Откроется всплывающее окно, как показано на рисунке ниже.

Теперь под шаблонами в левой части будут два языковых варианта для создания веб-сайта. выберитеVisual C# и выберите ASP.NET Empty Web Site.

Выберите папку, в которую вы хотите сохранить новый веб-сайт в вашей системе. Затем нажмитеOK и так далее Solution Explorerпоявляется на вашем экране, содержащий все веб-файлы. Щелкните правой кнопкой мыши Default.aspx в обозревателе решений и выберите «Просмотр в браузере», чтобы просмотреть веб-сайт ASP.NET по умолчанию в браузере. Вскоре ваш новый веб-сайт ASP.NET откроется в веб-браузере, как показано на следующем снимке экрана.

.aspx на самом деле является основным расширением файлов, используемым на веб-сайтах ASP.NET. Visual Studio по умолчанию создает все необходимые страницы для базового веб-сайта, напримерHome page и About Usстраница, на которой вы можете удобно разместить свой контент. Код для веб-сайта создается здесь автоматически, и его тоже можно просмотреть.

Элемент управления LINQDataSource

Возможно UPDATE, INSERT и DELETEданные на страницах сайта ASP.NET с помощью элемента управления LINQDataSource. Нет абсолютно никакой необходимости в спецификации команд SQL, поскольку элемент управления LINQDataSource использует динамически созданные команды для таких операций.

Этот элемент управления позволяет пользователю удобно использовать LINQ на веб-странице ASP.NET, задав свойства в тексте разметки. LINQDataSource очень похож на элементы управления вродеSqlDataSource так же как ObjectDataSourceпоскольку его можно использовать для привязки других элементов управления ASP.NET, присутствующих на странице, к источнику данных. Итак, мы должны иметьdatabase для объяснения различных функций, вызываемых элементом управления LINQDataSource.

Прежде чем приступить к объяснению использования элемента управления в форме веб-страницы ASP.NET, необходимо открыть панель инструментов Microsoft Visual Studio и перетащить элемент управления LINQDataSource на страницу .aspx веб-сайта ASP.NET, как показано на рисунке ниже.

Следующим шагом является настройка LINQDataSource путем выбора всех столбцов для записи о сотруднике.

Теперь добавьте элемент управления GridView на страницу .aspx и настройте его, как показано на рисунке ниже. Элемент управления GridView является мощным и предлагает гибкость для работы с данными. Вскоре после настройки элемента управления он появится в браузере.

Кодировка, которую теперь можно просмотреть на вашем экране для страницы .aspx, будет -

<!DOCTYPE html>

<html>
   <head runat = "server">
      <title></title>
   </head>

   <body>
      <form id = "form1" runat = "server">
         <div>
            <asp:GridView ID = "GridView1" runat = "server" AutoGenerateColumns = "False"
			
               DataKeyNames = "ContactID" DataSourceID = "LINQDataSource1">
               <Columns>
			   
                  <asp:BoundField DataField = "ContactID" HeaderText = "ContactID"
                     InsertVisible = "False" ReadOnly="True" SortExpression = "ContactID" />
                  <asp:CheckBoxField DataField = "NameStyle" HeaderText = "NameStyle"
                     SortExpression = "NameStyle" />
                  <asp:BoundField DataField = "Title" HeaderText = "Title" SortExpression = "Title" />
                  <asp:BoundField DataField = "FirstName" HeaderText = "FirstName"
                     SortExpression="FirstName" />
                  <asp:BoundField DataField = "MiddleName" HeaderText = "MiddleName"
                     SortExpression = "MiddleName" />
                  <asp:BoundField DataField = "LastName" HeaderText = "LastName"
                     SortExpression = "LastName" />
                  <asp:BoundField DataField = "Suffix" HeaderText = "Suffix"
                     SortExpression = "Suffix" />
                  <asp:BoundField DataField = "EmailAddress" HeaderText = "EmailAddress"
                     SortExpression = "EmailAddress" />
               </Columns>

            </asp:GridView>

            <br />

         </div>

         <asp:LINQDataSource ID = "LINQDataSource1" runat = "server"

            ContextTypeName = "LINQWebApp1.AdventureWorksDataContext" EntityTypeName = ""
               TableName = "Contacts">

         </asp:LINQDataSource>
      </form>
   </body>
</html>

Здесь следует отметить, что очень важно установить для свойства ContextTypeName значение класса, представляющего базу данных. Например, здесь он указан как LINQWebApp1.AdventureWorksDataContext, поскольку это действие установит необходимое соединение между LINQDataSource и базой данных.

INSERT, UPDATE и DELETE данные на странице ASP.NET с использованием LINQ

После тщательного выполнения всех вышеперечисленных шагов выберите LINQDataSource Tasks из LINQDataSource Control и выберите все три поля для включения вставки, включения обновления и включения удаления из того же, как показано на следующем снимке экрана.

Вскоре декларативная разметка будет отображаться на вашем экране в следующем виде.

<asp:LINQDataSource 
   ContextTypeName = "LINQWebApp1.AdventureWorksDataContext" 
   TableName = "Contacts" 
   EnableUpdate = "true" 
   EnableInsert = "true" 
   EnableDelete = "true" 
   ID = "LINQDataSource1" 
   runat = "server">
</asp:LINQDataSource>

Теперь, поскольку имеется несколько строк и столбцов, лучше добавить еще один элемент управления в форму .aspx с именем «Подробное представление» или «Главный элемент управления» под элементом управления «Просмотр сетки», чтобы отображать только сведения о выбранной строке сетки. Выберите задачи детального просмотра в элементе управления детального просмотра и установите флажки, как показано ниже.

Теперь просто сохраните изменения и нажмите Ctrl + F5, чтобы просмотреть страницу в вашем браузере, где теперь можно удалить, обновить, вставить любую запись в элемент управления подробным представлением.