Galin Iliev

Software Architecture & Development

LINQ в детайли

След като разгледахме в детайли синтактичните допълнения към C# във версия 3.0 e време да разгледаме в детайли как може да се построяват заявки в C# - или с други думи казано – да разгледаме LINQ. Преди да започнем нека да направим малко уточнение – LINQ синтаксиса е само едно улеснение с цел прегледност на кода и по-лесна читаемост. LINQ използва основно разширяващи методи, ламбда изрази и дървета от изрази, за да се постигне желаната фунционалност. Т.е функционалността, която дава LINQ може да бъде постигната с подходяща комбинация на горните. (С образователна цел може да се упражнявате пишейки LINQ и „нормален” код, за да проверите доколко разбирате начина, по който LINQ обработва заявките). За да стане по-ясно нека да разгледаме малко код – нека се върнем малко назад и да разгледаме в детайли кода от точката Филтриране с LINQ и C# 3.0. Както казахме тогава кода от методите FilterWithCSharp3 и FilterWithCSharp3_2 извършват идентични действия. Това е възможно, понеже компилаторът взема синтаксиса и го конвертира към код, извикващ методи и използващ разширяващи методи, ламбда изрази и дървета от изрази.

Всяка LINQ заявка започва с from и завършва със select или group, като from клаузата указва източника на данни, а select указва резултата ( както и формата/типа на резулата ).

Нека да разгледаме заявката от FilterWithCSharp3 в детайли:

var result = from s in contacts
             where
s.StartsWith("G")
             select
s;

На първият ред се указва, че ще се използва елемените от променливата contacts (която трябва да бъде от тип IEnumerable) за източник на данни. При обработката на елементите всеки от тях ще бъде достъпен през променливата s, като това е произволно избрано – може да бъде t, m, f или всяка друга незаета променлива (като правило се е наложило променливите към елементите да бъдат кратки, за да не се бъркат с типовете или колекциите). Или накратко първият ред означава – за всеки елемент s в колекцията contacts….

На вторият ред е филтъра, както подсказва ключовата дума where. След нея се поставя условие, резултата от което трябва да е от тип bool. Могат да се поставят множество условия като се използват операторите за логически операции || и &&.

На последният ред опрераторът select връща обект като резултат. Не е задължително да бъде същият елемент, който е взет от входящите данни – може да бъде свойство на елемента ( написано като select e.Name; ако обекта е от тип Employeeвиж точка Групиране с LINQ и C# 3.0) или изцяло нов обект от анонимен тип.

За тези, които имат опит със SQL този начин на изписване едва ли изглежда много различно и привикването към него е изключително лесно. Още повече, че Visual Studio предоставя intellisense.

 

Следваща част: Основни оператори

Content