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.
Следваща част: Основни оператори