C#: LINQ язык запросов

краткая шпаргалка

Language integrated query — удобная программная конструкция встроенная в C#. LINQ не является подобием SQL, хотя и используется для работы с наборами данных.В основе лежат следующие технологии технологии:

  • Неявная типизация переменных
  • Синтаксис инициализации объектов и коллекций
  • Лямбда-выражения
  • Расширяющий метод
  • Анонимные типы

Неявная типизация переменных:

 var t = 0;

Синтаксис инициализации объектов и коллекций:

List<Car> myListCar = new List<Car> 
                {new Car( "Mers", 4000), new Car( "Volv", 3000), 
                new Car( "Star", 2000), new Car( "Zap", 300)};

Лямбда-выражения:

List<Car> nostar = myListCar.FindAll(car => car.Modele != "Star");

Расширяющий метод:

//расширяющие методы - объявление
    static class ObjectExtensions
    {
        // Определение расширяющего метода для System.Object. 
        public static void DisplayDefiningAssembly(this object obj)
        {
            Console.WriteLine("{0} lives here:\n\t->{1}\n", obj.GetType().Name, Assembly.GetAssembly(obj.GetType()));
        }
    }

//расширяющий метод - использование
            nostar.DisplayDefiningAssembly();

Анонимные типы:

 var anonym = new { TimeBought = DateTime.Now, ItemBought = new Car("Fax", 3300) };
            anonym.DisplayDefiningAssembly();

Рассмотрим пример работы с массивом:

 string[] Names = { "Вася Пупкин", "Ибрагим", "Шарик", "Василий Петрович", "Тараторкин Гена", "Тузик", 
                                 "улица Кропоткина", "Зима", "Буренка", "Самосвал Иванович", "Криптограмма" };

LINQ возвращает IEnumerable — это все что известно о типе возращаемого объекта. Что за ним кроется заранее неизвестно
В .NET определены огромное количество расширяемых методов, поэтому мы видим методы, которые зачастую не определены в методах самих объектов.

 IEnumerable<string> subset = from g in Names where g.Contains(" ") orderby g select g;
            foreach (string s in subset)
                Console.WriteLine(s);

Возвращаемый запросом LINQ тип заранее неизвестен в общем случае, поэтому используем неявную переменную:

var set = from g in Names where g.EndsWith("а") orderby g select g;

LINQ запрос выполняется не во время запроса (так называемое отложенное выполнение). На самом деле выполнение происходит во время прохода по данным в цикле foreach:

foreach (var s in set)
                Console.WriteLine(s);

Отложенное выполнение не происходит, если к результату приложить один из расширяемых методов методов Enumerable:

string[] subset1 = (from g in Names where g.Length < 7 orderby g select g).ToArray();
            foreach (string s in subset1)
                Console.WriteLine(s);

LINQ легко применяется к коллекциям:

 var dearCars = from c in myListCar where c.Price > 3000 && c.Modele.Contains("e") select c;
            var cheepCars = from c in myListCar where c.Price < 3000 select c;
            foreach (var car in cheepCars) 
            { 
                Console.WriteLine("{0} is cheep", car.Modele); 
            }

LINC предназначены для работы с теми, кто наследует IEnumerable
System.Collections не наследует его, для таких случаев делаем так:

  ArrayList myCars = new ArrayList(); 
            var myCarsEnum = myCars.OfType<Car>();//

OfType можно использовать для фильтрации объектов в необощенной коллекции например OfType извлечет только данные типа int:

myCars = new ArrayList { 100, "sorry", new Car("ftor", 330), DateTime.Now, 223 };
            var muInt = myCars.OfType<int>();

LINQ запрос — извлекаем все:

 var AllCars = from c in myListCar select c;

или только модели авто:

 var CarModels = from c in myListCar select c.Modele;

или подмножество, удовлетворяющее условиям:

 var CarSub1 = from c in myListCar where c.Price < 200 && c.Modele.Contains("M") select c;

проекция и выдача новых анонимных типов:

 var CarProj = from c in myListCar where c.Price >= 70 select new { c.Modele, DateTime.Now };
            foreach (var c in CarProj)
                Console.WriteLine("Car {0} is {1}", c.Modele, c.Now);

Получение счетчиков и другие агрегатные операции Count() Min() Max() Average() Sum() расширяющими методами IEnumerable:

 int num = (from c in myListCar where c.Modele == "Mers" select c).Count();

Обращение набора:

var revers = from c in myListCar select c;
            foreach (var c in revers.Reverse())
                Console.WriteLine("");

Выражение сортировки (ascending по умолчанию можно опустить):

  var sort1 = from c in myListCar orderby c.Price descending select c;
            var sort2 = from c in myListCar orderby c.Price ascending select c; 

Операции с множествами — разность между контейнерами:

List<Car> yourListCar = new List<Car> { new Car("Mers", 434), new Car("Volv", 3022), new Car("Star", 2000), new Car("Zapo", 300) };
            var di = (from c in myListCar select c).Except(from y in yourListCar select y);
            foreach (var c in di)
                Console.WriteLine("{0}",c.Modele);

Операции с множествами — общие члены:

 var di1 = (from c in myListCar select c).Intersect(from y in yourListCar select y);

Общий набор:

 var di2 = (from c in myListCar select c).Union(from y in yourListCar select y);
            foreach (var c in di2)
                Console.WriteLine("{0}", c.Modele);

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

var di3 = (from c in myListCar select c).Concat(from y in yourListCar select y);

Исключение дублей:

foreach (var c in di3.Distinct())
                Console.WriteLine("{0}", c.Modele);

Построение запросов с использованием Enumerable и лямбда выражений where orderby — просто упрощенный метод записи расширяемых методов Enumerable принимающих делегат Func<> с разными параметрами и с использованием лямбда функций в качестве делегата:

var res1 = myListCar.Where(c => c.Price > 200).Select(c => c);
            foreach (var c in res1)
                Console.WriteLine("{0}", c.Modele);

Теперь тоже самое, но явно:

Func<Car, bool> searchFilter = delegate(Car c) { return (c.Price > 200); };
            Func<Car, Car> objToProcess = delegate(Car car) { return car; };
            var res2 = myListCar.Where(searchFilter).Select(objToProcess);
            foreach (var c in res2)
                Console.WriteLine("{0}", c.Modele);

Построение запросов с использованием Enumerable и низкоуровневых типов совсем без лямбда и анонимных функций:

 Func<Car, bool> searchFilter1 = new Func<Car, bool>(Filter);
            Func<Car, Car> objToProsess1 = new Func<Car, Car>(ProcessItem);
            var res3 = myListCar.Where(searchFilter1).Select(objToProsess1);
            foreach (var c in res3)
                Console.WriteLine("{0}", c.Modele);

 static bool Filter(Car car)
        {
            return car.Price > 200;
        }
        static Car ProcessItem(Car car)
        {
            return car;
        }

Исходник файла:

Добавить комментарий

Ваш адрес email не будет опубликован.

Найти на сайте
Со страниц сайта
Метки
хохмаУмные мыслиармейский юморДела семейныеДокторинформацияой болитфольклорВовочка & kidsВадим ЗверевПолитическиеСтатусы ВКотактеСобрание скороговорокБольшие и малые народностиПро животныхЗаконы МерфиженщиныПро это...Забойный наборНиколай ФоменкоВсякая всякотаалкоманы-наркоголикиПро услуги и рестораныВиктор ШендеровичБородатые анекдотыавтомобилистыТуристы и турыИскусство и киноПро работуКозьма ПрутковПро студентовОмар ХайямЧерномырдинСтатусы про женщин и мужчинВ общественном транспортеПро сумасшедшихСтанислав Ежи ЛецКриминальныеПро ШтирлицаСтас ЯнковскийСмешные статусыДурацкие законыПро юристовпро самолетыПечалькаПро братковХорошие советыНе та ориентацияМарк ТвенСтатусы про жизньНа селеКрасноармейскиеГусары и поручикиДразнилкиИностранные анекдотыСказочныеХрюн МоржовФрансуа де ЛарошфукоЧерный юморЖан-Жак РуссоОхота и рыбалкаПрограммистыЛеди и джентельменыСпортНа бога надейся...МультяшкиБизнесСчиталкиУильям ШекспирГеоргий ФрумкерФрансис БэконПраздникиДикий западШутливая лотереяБедные и богатыеРаневскаяПьер Огюстен Карон де БомаршеСоветы и ответыДикариИсторические анекдотыНикколо МакиавеллиНаполеон БонапартЗагадкиsongswordpresstraditionalpluginпоговоркиC#старостьmysqlЧастушкиbackendjavascripthostingsshajaxphpстатистикапандемия
Больше Меньше
Архивы
Рейтинг@Mail.ru