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.