Ответ 1
LINQ означает Language Integrated Query.
Вместо того, чтобы писать YAQL (еще один язык запросов), разработчики языка Microsoft предоставили возможность выражать запросы непосредственно на своих языках (например, С# и Visual Basic). Методы формирования этих запросов не зависят от деталей реализации запрашиваемой вещи, поэтому вы можете писать достоверные запросы по многим объектам (базам данных, объектам в памяти, XML) практически без учета основного способа, которым запрос будет выполнен.
Позвольте начать исследование с частей, принадлежащих.NET Framework (3.5).
-
LINQ To Objects - проверить System.Linq.Enumerable для методов запросов. Эти целевые
IEnumerable<T>
, позволяющие запрашивать любую типизированную циклическую коллекцию безопасным образом. Эти запросы зависят от скомпилированных методов.NET, а не от выражений. -
LINQ To Anything - рассмотрите System.Linq.Queryable для некоторых методов запросов. Эти целевые
IQueryable<T>
, позволяющие построить деревья выражений, которые могут быть переведены с помощью базовой реализации. -
Деревья выражений - рассмотрите пространство имен System.Linq.Expressions. Это код как данные. На практике вы должны знать об этом, но на самом деле не нужно писать код против этих типов. Языковые функции (например, лямбда-выражения) могут позволить вам использовать различные короткие руки, чтобы не обращаться к этим типам напрямую.
-
LINQ To SQL - проверьте пространство имен System.Data.Linq. Особенно обратите внимание на
DataContext
. Это технология DataAccess, созданная командой С#. Это просто работает. -
LINQ To Entities - просмотр пространства имен System.Data.Objects. Особенно обратите внимание на
ObjectContext
. Это технология DataAccess, созданная командой ADO.NET. Он сложный, мощный и сложнее в использовании, чем LINQ To SQL. -
LINQ To XML - проверьте пространство имен System.Xml.Linq. По сути, люди не были довольны материалом в
System.Xml
. Таким образом, Microsoft перезаписала его и воспользовалась переписыванием, чтобы представить некоторые методы, облегчающие использование LINQ To Objects против XML. -
Некоторые хорошие вспомогательные типы, такие как Func и Action. Эти типы являются делегатами с общей поддержкой. Прошли те времена, когда вы объявляли свои собственные (и неперепутаемые) типы делегатов.
Все это является частью.NET Framework и доступно на любом языке.NET(VB.NET, С#, IronPython, COBOL.NET и т.д.).
Хорошо, по языковым возможностям. Я буду придерживаться С#, так как это то, что я знаю лучше всего. У VB.NET также было несколько подобных улучшений (и пара, которую С# не получал - XML-литералы). Это короткий и неполный список.
-
Методы расширения - это позволяет вам "добавить" метод для ввода. Метод действительно является статическим методом, которому передается экземпляр типа и ограничен публичным контрактом типа, но он очень полезен для добавления методов к типам, которые вы не контролируете (строка), или добавлению (полностью реализовано ) вспомогательные методы для интерфейсов.
-
Синтаксис понимания запроса - это позволяет вам писать в структуре SQL Like. Весь этот материал переводится в методы System.Linq.Queryable или System.Linq.Enumerable (в зависимости от типа myCustomers). Это совершенно необязательно, и вы можете использовать LINQ без него. Одним из преимуществ этого стиля объявления запроса является то, что переменные диапазона имеют область действия: они не требуют повторного объявления для каждого предложения.
IEnumerable<string> result = from c in myCustomers where c.Name.StartsWith("B") select c.Name;
-
Лямбда-выражения - это сокращение для указания метода. Компилятор С# переводит каждый в анонимный метод или в истинное
System.Linq.Expressions.Expression
. Вам действительно нужно понять, что они хорошо используют Linq. Есть три части: список параметров, стрелка и тело метода.IEnumerable<string> result = myCustomers .Where(c => c.Name.StartsWith("B")) .Select(c => c.Name);'
-
Анонимные типы. Иногда у компилятора достаточно информации для создания типа для вас. Эти типы не являются поистине анонимными: компилятор называет их, когда он их создает. Но эти имена создаются во время компиляции, что слишком поздно для разработчика, чтобы использовать это имя во время разработки.
myCustomers.Select(c => new { Name = c.Name; Age = c.Age; })
-
Неявные типы. Иногда у компилятора достаточно информации из инициализации, что он может определить тип для вас. Вы можете дать команду компилятору сделать это, используя ключевое слово var. Неявная типизация требуется для объявления переменных для анонимных типов, поскольку программисты не могут использовать имя анонимного типа.
// The compiler will determine that names is an IEnumerable<string> var names = myCustomers.Select(c => c.Name);