SlideShare a Scribd company logo
Темы лекции: LINQ.
Практическое задание: LINQ.
Тренер: Игорь Шкулипа, к.т.н.
Платформа .Net и язык программирования C#.
Занятие 13
http://www.slideshare.net/IgorShkulipa 2
LINQ
Традиционно запросы к данным выражаются в виде простых строк без
проверки типов при компиляции или поддержки IntelliSense. Кроме
того, разработчику приходится изучать различные языки запросов для
каждого из типов источников данных: баз данных SQL, XML-
документов, различных веб-служб и т. д. LINQ делает запросы очень
удобной конструкцией языков C# и Visual Basic. Разработчики создают
запросы к строго типизированным коллекциям объектов с помощью
зарезервированных слов языка и знакомых операторов.
Language-Integrated Query (LINQ) - язык интегрированных запросов.
LINQ позволяет извлекать информацию из различных источников данных.
В основу LINQ положено понятие запроса, в котором определяется
информация получаемая из источника данных. После формирования
запроса происходит его выполнение.
Запрос представляет собой выражение, извлекающее данные из
источника данных. Запросы обычно выражаются на специальном
языке запросов.
Доступно несколько реализаций LINQ: LINQ to Objects, LINQ to SQL, LINQ
to DataSet, LINQ to Entities и LINQ to XML.
http://www.slideshare.net/IgorShkulipa 3
Пример
class PersoneInfo
{
public string Name { get; set; }
public string Surname { get; set; }
public string Middle { get; set; }
public DateTime BirthDate { get; set; }
public override string ToString()
{
return
String.Format
("{0} {1} {2} : {3}", Surname, Name, Middle, BirthDate);
}
}
http://www.slideshare.net/IgorShkulipa 4
Пример
static void Main(string[] args)
{
List<PersoneInfo> people = new List<PersoneInfo> {
new PersoneInfo{
Name="Ivan",
Surname="Ivanov",
Middle="Ivanovich",
BirthDate=DateTime.Parse("1/1/1980")},
new PersoneInfo{
Name="Petr",
Surname="Petrov",
Middle="Petrovich",
BirthDate=DateTime.Parse("2/2/1990")},
new PersoneInfo{
Name="Sidor",
Surname="Sidorov",
Middle="Sidorovich",
BirthDate=DateTime.Parse("3/3/1985")}
};
http://www.slideshare.net/IgorShkulipa 5
Пример
var resultQuery1 = from persone in people
where persone.BirthDate > DateTime.Parse("1/1/1985")
orderby persone.Surname, persone.Name
select new { Name = persone.Name, Surname = persone.Surname };
var resultQuery2 = from persone in people
where persone.BirthDate > DateTime.Parse("1/1/1985")
orderby persone.Surname, persone.Name
select persone;
foreach (var per in resultQuery1)
{
Console.WriteLine(per.ToString());
}
foreach (var per in resultQuery2)
{
Console.WriteLine(per.ToString());
}
Console.ReadKey();
}
{ Name = Petr, Surname = Petrov }
{ Name = Sidor, Surname = Sidorov }
Petrov Petr Petrovich : 02.02.1990 0:00:00
Sidorov Sidor Sidorovich : 03.03.1985 0:00:00
http://www.slideshare.net/IgorShkulipa 6
Расширяющие методы и лямбда-выражения
В пространстве имен System.Linq есть два статический класса, которые
содержат множество расширяющих методов – Enumerable и Queryable.
Классы Enumerable и Queryable предоставляют набор расширяющих
методов для интерфейсов IEnumerable и IQueryable соответственно.
Имена этих расширяющих методов совпадают с именами конструкций
запросов. Это не случайно, так как, в действительности, эти методы
реализуют операции запросов LINQ.
Интерфейс IQueryable предназначен для реализации поставщиками
запросов. Он реализуется только поставщиками, которые также
реализуют интерфейс IQueryable<T>. Если поставщик не реализует
IQueryable<T>, для его источника данных не могут использоваться
стандартные операторы запросов.
Интерфейс IQueryable наследует интерфейс IEnumerable, поэтому если он
представляет запрос, результаты этого запроса будут допускать
перечисление.
http://www.slideshare.net/IgorShkulipa 7
Тот же пример с расширяющими методами
var resultQuery3 = people
.Where(persone => persone.BirthDate > DateTime.Parse("1/1/1985"))
.OrderBy(persone => persone.Surname)
.OrderBy(persone => persone.Name)
.Select(persone => new { Name = persone.Name, Surname = persone.Surname });
var resultQuery4 = people
.Where(persone => persone.BirthDate > DateTime.Parse("1/1/1985"))
.OrderBy(persone => persone.Surname)
.OrderBy(persone => persone.Name)
.Select(persone => persone);
foreach (var per in resultQuery3)
{
Console.WriteLine(per.ToString());
}
foreach (var per in resultQuery4)
{
Console.WriteLine(per.ToString());
}
{ Name = Petr, Surname = Petrov }
{ Name = Sidor, Surname = Sidorov }
Petrov Petr Petrovich : 02.02.1990 0:00:00
Sidorov Sidor Sidorovich : 03.03.1985 0:00:00
http://www.slideshare.net/IgorShkulipa 8
Синтаксис LINQ
Каждое выражение запроса начинается с конструкции from, которая
объявляет переменную диапазона.
Конструкция from, похожа на оператор foreach в том, что она
осуществляет итерацию по элементам коллекции people, сохраняя на
каждом шаге очередной элемент коллекции в переменной persone.
После конструкции from следуют различные операции запроса для
фильтрации данных переменной диапазона.
В примере применяются операции where и orderby.
Выражение закрывается операцией проекции (select). Применение
операции проекции обычно приводит к созданию новой коллекции –
результата выполнения запроса.
101 LINQ Samples
Основные конструкции LINQ
http://www.slideshare.net/IgorShkulipa 9
Ключевые слова запросов LINQ
from, join, where, group, into, let, ascending,
descending, on, equals, in, orderby, select
http://www.slideshare.net/IgorShkulipa 10
Конструкция from
Каждый запрос начинается с конструкции from. Конструкция from – это
генератор, который определяет переменную диапазона - локальную
переменную, используемую для представления каждого элемента
входной коллекции, по мере применения к ней выражения запроса.
Выражения запроса может содержать более одной конструкции from.
Пример – генерация таблицы умножения.
var multTable = from a in Enumerable.Range(1, 10)
from b in Enumerable.Range(1, 10)
select new { A = a, B = b, AB = a * b };
foreach (var item in multTable)
{
Console.WriteLine("{0}*{1}={2}", item.A, item.B, item.AB);
}
1*1=1
1*2=2
1*3=3
1*4=4
1*5=5
1*6=6
...
10*6=60
10*7=70
10*8=80
10*9=90
10*10=100
http://www.slideshare.net/IgorShkulipa 11
Конструкция join
Конструкция join может использоваться для сопоставления данных из
двух различных источников.
class PersoneInfo
{
public string Name { get; set; }
public string Surname { get; set; }
public string Middle { get; set; }
public DateTime BirthDate { get; set; }
public string NationalityID { get; set; }
public override string ToString()
{
return String
.Format("{0} {1} {2} : {3}", Surname, Name, Middle, BirthDate);
}
}
class PersoneNationality
{
public string ID { get; set; }
public string Name { get; set; }
}
http://www.slideshare.net/IgorShkulipa 12
Пример join
List<PersoneInfo> people = new List<PersoneInfo> {
new PersoneInfo{
Name="Ivan",
Surname="Ivanov",
Middle="Ivanovich",
NationalityID="222",
BirthDate=DateTime.Parse("1/1/1980")},
new PersoneInfo{
Name="Petr",
Surname="Petrov",
Middle="Petrovich",
NationalityID="111",
BirthDate=DateTime.Parse("2/2/1990")},
new PersoneInfo{
Name="Sidor",
Surname="Sidorov",
Middle="Sidorovich",
NationalityID="111",
BirthDate=DateTime.Parse("3/3/1985")}
};
List<PersoneNationality> nationalities =
new List<PersoneNationality> {
new PersoneNationality{
ID= "111",
Name="Ukraine"},
new PersoneNationality{
ID="222",
Name="Russian"}
};
http://www.slideshare.net/IgorShkulipa 13
Пример join
var resultQuery = from persone in people
join nation in nationalities
on persone.NationalityID equals nation.ID
orderby nation.Name descending
select new
{
Name = persone.Name,
Surname = persone.Surname,
Middle = persone.Middle,
Nationality = nation.Name
};
foreach (var per in resultQuery)
{
Console.WriteLine("{0} {1} {2} - {3}",
per.Surname, per.Name, per.Middle, per.Nationality);
}
Petrov Petr Petrovich - Ukraine
Sidorov Sidor Sidorovich - Ukraine
Ivanov Ivan Ivanovich - Russian
http://www.slideshare.net/IgorShkulipa 14
Конструкция where
Конструкция where – это конструкция фильтров. Она следует за
конструкциями from и join.
Фильтры состоят из ключевого слова where, за которым следует
выражение условия.
var resultQuery1 =
from persone in people
where persone.BirthDate > DateTime.Parse("1/1/1985")
orderby persone.Surname, persone.Name
select new { Name = persone.Name, Surname = persone.Surname };
var resultQuery2 =
from persone in people
where persone.BirthDate > DateTime.Parse("1/1/1985")
orderby persone.Surname, persone.Name
select persone;
http://www.slideshare.net/IgorShkulipa 15
Конструкция orderby
Конструкция orderby используется для сортировки результатов запроса.
За ключевым словом orderby следует элемент, по значению которого
должна проводиться сортировка, обычно это какое-то свойство
переменной диапазона.
Сортировку можно выполнять как в порядке возрастания (ascending) так
и в порядке убывания (descending). Если ключевое слово явно не
указано, то принимается сортировка по возрастанию (ascending).
var resultQuery = from persone in people
join nation in nationalities
on persone.NationalityID equals nation.ID
orderby nation.Name descending,
persone.Name ascending,
persone.Surname
select new
{
Name = persone.Name,
Surname = persone.Surname,
Middle = persone.Middle,
Nationality = nation.Name
};
http://www.slideshare.net/IgorShkulipa 16
Конструкция select
Конструкция select служит для производства конечного результата
запроса. Она называется проектором, по этому проектирует
(транслирует) данные внутри запроса в форму, удобную для
применения.
Компилятор преобразует конструкцию select в вызов расширяющего
метода Select. Тело конструкции select преобразуется в лямбда-
выражение, передаваемое методу Select, который использует его для
производства каждого элемента результирующего набора.
var multTable = from a in Enumerable.Range(1, 10)
from b in Enumerable.Range(1, 10)
select new { A = a, B = b, AB = a * b };
http://www.slideshare.net/IgorShkulipa 17
Конструкция let
Конструкция let предоставляет новый локальный идентификатор, на
который можно ссылаться в следующей части запроса.
var letQuery = from persone in people
let fullName = persone.Name + " " +
persone.Middle + " " +
persone.Surname
orderby fullName descending
select fullName;
foreach (var fname in letQuery)
{
Console.WriteLine(fname);
}
Sidor Sidorovich Sidorov
Petr Petrovich Petrov
Ivan Ivanovich Ivanov
http://www.slideshare.net/IgorShkulipa 18
Конструкция group
Конструкция gourp является средством для разбиения входных данных
запроса на части.
Конструкция gourp - это проектор, который проектирует данные в
коллекцию интерфейсов IGrouping.
Интерфейс IGrouping определен в пространстве имен System.Linq и
унаследован от IEnumerable. По этому IGrouping можно применять
везде, где можно применять IEnumerable.
Интерфейс IGrouping включает свойство по имени Key, которое является
объектом, описывающим подмножество.
Каждый результирующий набор формируется применением операции
эквивалентности к входным данными Key.
http://www.slideshare.net/IgorShkulipa 19
Пример group
var groupQuery = from number in Enumerable.Range(0, 50)
group number by number % 2;
foreach (var group in groupQuery)
{
Console.WriteLine("nmod2={0}", group.Key);
foreach (var number in group)
{
Console.Write("{0}, ", number);
}
}
mod2=0
0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30,
32, 34, 36, 38, 40, 42, 44, 46, 48,
mod2=1
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31,
33, 35, 37, 39, 41, 43, 45, 47, 49,
http://www.slideshare.net/IgorShkulipa 20
Конструкция into
Конструкция into подобна использованию конструкции let в том, что она
определяет локальную переменную внутри запроса.
Использование конструкции into сообщает компилятору о присвоении
результата конструкций group или join в локальную переменную,
которая будет использоваться позднее в следующей части запроса.
Конструкцию into еще называют конструкцией продолжения,
поскольку конструкции group и into не являются окончанием запроса.
Конструкцию into так же работает как генератор, подобно конструкции
from и идентификатор, предоставленный into во многом подобен
переменной диапазона from.
http://www.slideshare.net/IgorShkulipa 21
Пример into
var intoQuery = from number in Enumerable.Range(0, 50)
group number by number % 2 into groups
select new
{
Key = groups.Key,
Count = groups.Count(),
Numbers = groups
};
foreach (var item in intoQuery)
{
Console.WriteLine("nmod2={0}", item.Key);
Console.WriteLine("Count={0}", item.Count);
foreach (var number in item.Numbers)
{
Console.Write("{0}, ", number);
}
}
var intoQuery = from number in Enumerable.Range(0, 50)
group number by number % 2 into groups
where groups.Key == 0
select new
{
Key = groups.Key,
Count = groups.Count(),
Numbers = groups
};
mod2=0
Count=25
0, 2, 4, 6, 8, 10, 12,
14, 16, 18, 20, 22, 24,
26, 28, 30, 32, 34, 36,
38, 40, 42, 44, 46, 48,
mod2=0
Count=25
0, 2, 4, 6, 8, 10, 12,
14, 16, 18, 20, 22, 24,
26, 28, 30, 32, 34, 36,
38, 40, 42, 44, 46, 48,
mod2=1
Count=25
1, 3, 5, 7, 9, 11, 13,
15, 17, 19, 21, 23, 25,
27, 29, 31, 33, 35, 37,
39, 41, 43, 45, 47, 49,
http://www.slideshare.net/IgorShkulipa 22
Пример LINQ запроса
Dictionary<string, List<string>> dictionary =
new Dictionary<string, List<string>>
{
{"привет",
new List<string>{"пирвет", "првиет", "првет"}},
{"пока",
new List<string>{"поак", "пка"}},
{"дела",
new List<string>{"деал", "дила", "дла", "дкла"}},
{"хорошо",
new List<string>{"хрошо", "хоршо", "хроошо"}},
{"удачи",
new List<string>{"удкчи", "уадчи", "удачм"}}
};
string wrongText =
"n- пирвет! как деал?n" +
"- првиет! дила хоршо.n" +
"- хрошо, удачм.n" +
"- поак.n";
http://www.slideshare.net/IgorShkulipa 23
Пример LINQ запроса
string[] words =
wrongText.Split(new char[] { ' ', '!', '.', ',', '?', '-' });
var correctDict = from dict in dictionary
let wrongWords = dict.Value
from val in wrongWords
join word in words on val equals word
select new
{
WrongWord = word,
CorrectWord = dict.Key
};
string correctText = wrongText;
foreach (var item in correctDict)
{
correctText =
correctText.Replace(item.WrongWord, item.CorrectWord);
}
Console.WriteLine("Wrong Text: {0}", wrongText);
Console.WriteLine("Correct Text: {0}", correctText);
Wrong Text:
- пирвет! как деал?
- првиет! дила хоршо.
- хрошо, удачм.
- поак.
Correct Text:
- привет! как дела?
- привет! дела хорошо.
- хорошо, удачи.
- пока.
http://www.slideshare.net/IgorShkulipa 24
LINQ to Objects
Термином "LINQ to Objects" называют использование запросов LINQ
непосредственно с коллекциями IEnumerable или IEnumerable<T> без
промежуточных поставщиков LINQ или API-интерфейсов, таких как LINQ to SQL
или LINQ to XML. LINQ можно использовать для запроса любых перечислимых
коллекций, таких как List<T>, Array или Dictionary<TKey, TValue>.
По сути, LINQ to Objects представляет новый подход к коллекциям. Раньше нужно
было писать сложные циклы foreach, которые определяли способ извлечения
данных из коллекции. При применении подхода LINQ создается декларативный
код с описанием необходимых извлекаемых данных.
Кроме того, запросы LINQ имеют три основных преимущества перед традиционными
циклами foreach.
• Они более компактные и удобочитаемые, особенно при фильтрации по
нескольким условиям.
• Они предоставляют мощные возможности фильтрации, упорядочивания и
группировки с минимальным объемом кода приложения.
• Они могут быть перенесены на другие источники данных с минимальными
изменениями или без изменений.
В общем случае, чем более сложные операции следует выполнить над данными, тем
больше преимуществ от применения LINQ вместо использования традиционных
методов итераций.
Ссылка на раздел MSDN
http://www.slideshare.net/IgorShkulipa 25
LINQ to Entities
LINQ to Entities обеспечивает поддержку LINQ при запросах к
сущностям.
Компонент позволяет разработчикам писать запросы к концептуальной
модели Entity Framework на языке Visual Basic или Visual C#.
Запросы к платформе Entity Framework представляются в виде дерева
команд запроса, выполняемого на контексте объектов.
Технология LINQ to Entities преобразует запросы LINQ в запросы в виде
дерева команд, выполняет эти запросы на платформе Entity Framework
и возвращает объекты, которые могут использоваться как платформой
Entity Framework, так и технологией LINQ.
Ссылка на раздел MSDN
http://www.slideshare.net/IgorShkulipa 26
LINQ to DataSet
LINQ to DataSet упрощает и ускоряет выполнение запросов к данным,
кэшированным в объекте DataSet. В особенности LINQ to DataSet
упрощает создание запросов, позволяя писать их непосредственно на
языке программирования, а не применять отдельный язык запросов.
Использование метода Select для выборки всех строк из таблицы Product
и отображения названий продуктов.
// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);
DataTable products = ds.Tables["Product"];
IEnumerable<DataRow> query =
from product in products.AsEnumerable()
select product;
Console.WriteLine("Product Names:");
foreach (DataRow p in query)
{
Console.WriteLine(p.Field<string>("Name"));
}
Ссылка на раздел MSDN
http://www.slideshare.net/IgorShkulipa 27
LINQ to XML
LINQ to XML обеспечивает интерфейс программирования для работы с
XML в памяти на основе платформы .NET LINQ Framework. LINQ to XML
использует новейшие возможности языка платформы .NET Framework
и может быть сравним с обновленным, переработанным программным
интерфейсом XML модели DOM.
Пример: как найти элемент с определенным атрибутом.
XElement root = XElement.Load("PurchaseOrder.xml");
IEnumerable<XElement> address =
from el in root.Elements("Address")
where (string)el.Attribute("Type") == "Billing"
select el;
foreach (XElement el in address)
Console.WriteLine(el);
Ссылка на раздел MSDN
http://www.slideshare.net/IgorShkulipa 28
LINQ to SQL
LINQ to SQL является компонентом .NET Framework, предоставляющим
инфраструктуру времени выполнения для управления реляционными
данными как объектами.
В LINQ to SQL модель данных реляционной базы данных сопоставляется
объектной модели, выраженной в языке программирования
разработчика. При запуске приложения LINQ to SQL преобразует
запросы LINQ из объектной модели в SQL и отправляет их в базу
данных для выполнения. Когда база данных возвращает результаты,
LINQ to SQL преобразует их обратно в объекты, с которыми можно
работать на собственном языке программирования.
Ссылка на раздел MSDN
http://www.slideshare.net/IgorShkulipa 29
Лабораторная работа №13. LINQ
В индивидуальном курсовом проекте, реализовать доступ к данным с
помощью LINQ:
• если используется база данных – LINQ to SQL
• если используется XML – LINQ to XML
• для итерации по коллекциям, по возможности использовать LINQ
to Objects

More Related Content

What's hot

Practical Language for Extracting Data from Source Codes and Preparing Them f...
Practical Language for Extracting Data from Source Codes and Preparing Them f...Practical Language for Extracting Data from Source Codes and Preparing Them f...
Practical Language for Extracting Data from Source Codes and Preparing Them f...
Denis Efremov
 
Android - 01 - Java Basics
Android - 01 - Java BasicsAndroid - 01 - Java Basics
Android - 01 - Java BasicsNoveo
 
объектно ориентированная платформа для построения
объектно ориентированная платформа для построенияобъектно ориентированная платформа для построения
объектно ориентированная платформа для построения
Gennady Zavyalov
 
08 - Java. Java-классы: взгляд изнутри
08 - Java. Java-классы: взгляд изнутри08 - Java. Java-классы: взгляд изнутри
08 - Java. Java-классы: взгляд изнутри
Roman Brovko
 
JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.
Igor Shkulipa
 
Oop java.generics
Oop java.genericsOop java.generics
Oop java.generics
muqaddas_m
 
11 - Java. Многопоточность в Java: средства стандартной библиотеки
11 - Java. Многопоточность в Java:  средства стандартной библиотеки11 - Java. Многопоточность в Java:  средства стандартной библиотеки
11 - Java. Многопоточность в Java: средства стандартной библиотеки
Roman Brovko
 
05 - Java. Collections Framework и Generics
05 - Java. Collections Framework и Generics05 - Java. Collections Framework и Generics
05 - Java. Collections Framework и Generics
Roman Brovko
 
Groovy jug-moscow-part 1
Groovy jug-moscow-part 1Groovy jug-moscow-part 1
Groovy jug-moscow-part 1
Evgeny Borisov
 
JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.
Igor Shkulipa
 
Android - 03 - Multithreading, Collections
Android - 03 - Multithreading, CollectionsAndroid - 03 - Multithreading, Collections
Android - 03 - Multithreading, CollectionsNoveo
 
10 - Java. Многопоточность в Java: основы
10 - Java. Многопоточность в Java: основы10 - Java. Многопоточность в Java: основы
10 - Java. Многопоточность в Java: основы
Roman Brovko
 
Formal verification of C code
Formal verification of C codeFormal verification of C code
Formal verification of C code
Denis Efremov
 
Spring data jee conf
Spring data jee confSpring data jee conf
Spring data jee conf
Evgeny Borisov
 

What's hot (14)

Practical Language for Extracting Data from Source Codes and Preparing Them f...
Practical Language for Extracting Data from Source Codes and Preparing Them f...Practical Language for Extracting Data from Source Codes and Preparing Them f...
Practical Language for Extracting Data from Source Codes and Preparing Them f...
 
Android - 01 - Java Basics
Android - 01 - Java BasicsAndroid - 01 - Java Basics
Android - 01 - Java Basics
 
объектно ориентированная платформа для построения
объектно ориентированная платформа для построенияобъектно ориентированная платформа для построения
объектно ориентированная платформа для построения
 
08 - Java. Java-классы: взгляд изнутри
08 - Java. Java-классы: взгляд изнутри08 - Java. Java-классы: взгляд изнутри
08 - Java. Java-классы: взгляд изнутри
 
JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.
 
Oop java.generics
Oop java.genericsOop java.generics
Oop java.generics
 
11 - Java. Многопоточность в Java: средства стандартной библиотеки
11 - Java. Многопоточность в Java:  средства стандартной библиотеки11 - Java. Многопоточность в Java:  средства стандартной библиотеки
11 - Java. Многопоточность в Java: средства стандартной библиотеки
 
05 - Java. Collections Framework и Generics
05 - Java. Collections Framework и Generics05 - Java. Collections Framework и Generics
05 - Java. Collections Framework и Generics
 
Groovy jug-moscow-part 1
Groovy jug-moscow-part 1Groovy jug-moscow-part 1
Groovy jug-moscow-part 1
 
JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.
 
Android - 03 - Multithreading, Collections
Android - 03 - Multithreading, CollectionsAndroid - 03 - Multithreading, Collections
Android - 03 - Multithreading, Collections
 
10 - Java. Многопоточность в Java: основы
10 - Java. Многопоточность в Java: основы10 - Java. Многопоточность в Java: основы
10 - Java. Многопоточность в Java: основы
 
Formal verification of C code
Formal verification of C codeFormal verification of C code
Formal verification of C code
 
Spring data jee conf
Spring data jee confSpring data jee conf
Spring data jee conf
 

Viewers also liked

Production diary 8
Production diary 8Production diary 8
Production diary 8
Laila Jaleel
 
C++ Базовый. Занятие 06.
C++ Базовый. Занятие 06.C++ Базовый. Занятие 06.
C++ Базовый. Занятие 06.
Igor Shkulipa
 
Vijay Bhosekar_ Research Article_ Frontiers in Plant Science
Vijay Bhosekar_ Research Article_ Frontiers in Plant ScienceVijay Bhosekar_ Research Article_ Frontiers in Plant Science
Vijay Bhosekar_ Research Article_ Frontiers in Plant Sciencevijay bhosekar
 
Production diary 5
Production diary 5Production diary 5
Production diary 5
Laila Jaleel
 
JavaScript Базовый. Занятие 05.
JavaScript Базовый. Занятие 05.JavaScript Базовый. Занятие 05.
JavaScript Базовый. Занятие 05.
Igor Shkulipa
 
Capitulo IV análisis de resultados
Capitulo IV análisis de resultados Capitulo IV análisis de resultados
Capitulo IV análisis de resultados
Ida Morán
 
C++ Базовый. Занятие 14.
C++ Базовый. Занятие 14.C++ Базовый. Занятие 14.
C++ Базовый. Занятие 14.
Igor Shkulipa
 
Happily_Disconnected
Happily_DisconnectedHappily_Disconnected
Happily_DisconnectedAmber Perkins
 
Organists Review.compressed
Organists Review.compressedOrganists Review.compressed
Organists Review.compressedJamie Singleton
 
Steffy
SteffySteffy
EE'13 - The Modern Marketer Can be Agile Too
EE'13 - The Modern Marketer Can be Agile TooEE'13 - The Modern Marketer Can be Agile Too
EE'13 - The Modern Marketer Can be Agile Toobentgate
 
C# Web. Занятие 07.
C# Web. Занятие 07.C# Web. Занятие 07.
C# Web. Занятие 07.
Igor Shkulipa
 
Production diary 8
Production diary 8Production diary 8
Production diary 8
Laila Jaleel
 
JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.
Igor Shkulipa
 
Fotos de la tesis
Fotos de la tesisFotos de la tesis
Fotos de la tesis
Ida Morán
 
Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.
Igor Shkulipa
 
Debian Installer Step by Step
Debian Installer Step by StepDebian Installer Step by Step
Debian Installer Step by Step
AF
 
C++ Базовый. Занятие 10.
C++ Базовый. Занятие 10.C++ Базовый. Занятие 10.
C++ Базовый. Занятие 10.
Igor Shkulipa
 

Viewers also liked (20)

Production diary 8
Production diary 8Production diary 8
Production diary 8
 
C++ Базовый. Занятие 06.
C++ Базовый. Занятие 06.C++ Базовый. Занятие 06.
C++ Базовый. Занятие 06.
 
Vijay Bhosekar_ Research Article_ Frontiers in Plant Science
Vijay Bhosekar_ Research Article_ Frontiers in Plant ScienceVijay Bhosekar_ Research Article_ Frontiers in Plant Science
Vijay Bhosekar_ Research Article_ Frontiers in Plant Science
 
Production diary 5
Production diary 5Production diary 5
Production diary 5
 
JavaScript Базовый. Занятие 05.
JavaScript Базовый. Занятие 05.JavaScript Базовый. Занятие 05.
JavaScript Базовый. Занятие 05.
 
Capitulo IV análisis de resultados
Capitulo IV análisis de resultados Capitulo IV análisis de resultados
Capitulo IV análisis de resultados
 
C++ Базовый. Занятие 14.
C++ Базовый. Занятие 14.C++ Базовый. Занятие 14.
C++ Базовый. Занятие 14.
 
Happily_Disconnected
Happily_DisconnectedHappily_Disconnected
Happily_Disconnected
 
assignment
assignmentassignment
assignment
 
Organists Review.compressed
Organists Review.compressedOrganists Review.compressed
Organists Review.compressed
 
Steffy
SteffySteffy
Steffy
 
EE'13 - The Modern Marketer Can be Agile Too
EE'13 - The Modern Marketer Can be Agile TooEE'13 - The Modern Marketer Can be Agile Too
EE'13 - The Modern Marketer Can be Agile Too
 
C# Web. Занятие 07.
C# Web. Занятие 07.C# Web. Занятие 07.
C# Web. Занятие 07.
 
Production diary 8
Production diary 8Production diary 8
Production diary 8
 
JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.
 
Fotos de la tesis
Fotos de la tesisFotos de la tesis
Fotos de la tesis
 
Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.
 
Debian Installer Step by Step
Debian Installer Step by StepDebian Installer Step by Step
Debian Installer Step by Step
 
PRES Eve's Dream
PRES Eve's DreamPRES Eve's Dream
PRES Eve's Dream
 
C++ Базовый. Занятие 10.
C++ Базовый. Занятие 10.C++ Базовый. Занятие 10.
C++ Базовый. Занятие 10.
 

Similar to C# Desktop. Занятие 13.

LINQ: How It Works
LINQ: How It WorksLINQ: How It Works
LINQ: How It Works
GetDev.NET
 
C# Web. Занятие 04.
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.
Igor Shkulipa
 
Как размножается Sphinx
Как размножается SphinxКак размножается Sphinx
Как размножается Sphinx
Alexander Byndyu
 
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
Pavel Tsukanov
 
Простой и кросс-платформенный WEB-сервер на .NET
Простой и кросс-платформенный WEB-сервер на .NETПростой и кросс-платформенный WEB-сервер на .NET
Простой и кросс-платформенный WEB-сервер на .NET
Mikhail Shcherbakov
 
Power of LINQ
Power of LINQPower of LINQ
Power of LINQ
Juri Mulenko
 
Apache Lucene + Hibernate = Hibernate Search
Apache Lucene + Hibernate = Hibernate SearchApache Lucene + Hibernate = Hibernate Search
Apache Lucene + Hibernate = Hibernate Search
Vitebsk Miniq
 
Приложения для Windows Phone: как мы это делаем #codefest
Приложения для Windows Phone: как мы это делаем #codefestПриложения для Windows Phone: как мы это делаем #codefest
Приложения для Windows Phone: как мы это делаем #codefest
Actis Wunderman
 
Протокол HTTP. Клиент-серверная модель взаимодействия. Servlet API
Протокол HTTP. Клиент-серверная модель взаимодействия. Servlet APIПротокол HTTP. Клиент-серверная модель взаимодействия. Servlet API
Протокол HTTP. Клиент-серверная модель взаимодействия. Servlet API
Ekaterina Kuchinskaya
 
Meet up khabarovsk_ifind
Meet up khabarovsk_ifindMeet up khabarovsk_ifind
Meet up khabarovsk_ifind
Elena Ometova
 
Лекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, LoaderЛекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, Loader
Александр Брич
 
Поиск багов в поиске
Поиск багов в поискеПоиск багов в поиске
Поиск багов в поискеyaevents
 
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
AvitoTech
 
ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS
Pavel Tsukanov
 
Blind SQL Injections. Достаточно ли хороши ваши тесты?
Blind SQL Injections. Достаточно ли хороши ваши тесты?Blind SQL Injections. Достаточно ли хороши ваши тесты?
Blind SQL Injections. Достаточно ли хороши ваши тесты?
Igor Bondarenko
 
So Your WAF Needs a Parser
So Your WAF Needs a ParserSo Your WAF Needs a Parser
So Your WAF Needs a Parser
yalegko
 
Приемочные тесты на огурце
Приемочные тесты на огурцеПриемочные тесты на огурце
Приемочные тесты на огурце
Alexander Byndyu
 
Delegates and events in C#
Delegates and events in C#Delegates and events in C#
Delegates and events in C#
Mikhail Shcherbakov
 
Blind Sql Injections. Хороши ли ваши тесты?
Blind Sql Injections. Хороши ли ваши тесты?Blind Sql Injections. Хороши ли ваши тесты?
Blind Sql Injections. Хороши ли ваши тесты?
Zestranec
 
Путь к чистому и компактному коду исполняемых спецификаций
Путь к чистому и компактному коду исполняемых спецификацийПуть к чистому и компактному коду исполняемых спецификаций
Путь к чистому и компактному коду исполняемых спецификаций
Vagif Abilov
 

Similar to C# Desktop. Занятие 13. (20)

LINQ: How It Works
LINQ: How It WorksLINQ: How It Works
LINQ: How It Works
 
C# Web. Занятие 04.
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.
 
Как размножается Sphinx
Как размножается SphinxКак размножается Sphinx
Как размножается Sphinx
 
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
 
Простой и кросс-платформенный WEB-сервер на .NET
Простой и кросс-платформенный WEB-сервер на .NETПростой и кросс-платформенный WEB-сервер на .NET
Простой и кросс-платформенный WEB-сервер на .NET
 
Power of LINQ
Power of LINQPower of LINQ
Power of LINQ
 
Apache Lucene + Hibernate = Hibernate Search
Apache Lucene + Hibernate = Hibernate SearchApache Lucene + Hibernate = Hibernate Search
Apache Lucene + Hibernate = Hibernate Search
 
Приложения для Windows Phone: как мы это делаем #codefest
Приложения для Windows Phone: как мы это делаем #codefestПриложения для Windows Phone: как мы это делаем #codefest
Приложения для Windows Phone: как мы это делаем #codefest
 
Протокол HTTP. Клиент-серверная модель взаимодействия. Servlet API
Протокол HTTP. Клиент-серверная модель взаимодействия. Servlet APIПротокол HTTP. Клиент-серверная модель взаимодействия. Servlet API
Протокол HTTP. Клиент-серверная модель взаимодействия. Servlet API
 
Meet up khabarovsk_ifind
Meet up khabarovsk_ifindMeet up khabarovsk_ifind
Meet up khabarovsk_ifind
 
Лекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, LoaderЛекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, Loader
 
Поиск багов в поиске
Поиск багов в поискеПоиск багов в поиске
Поиск багов в поиске
 
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
 
ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS
 
Blind SQL Injections. Достаточно ли хороши ваши тесты?
Blind SQL Injections. Достаточно ли хороши ваши тесты?Blind SQL Injections. Достаточно ли хороши ваши тесты?
Blind SQL Injections. Достаточно ли хороши ваши тесты?
 
So Your WAF Needs a Parser
So Your WAF Needs a ParserSo Your WAF Needs a Parser
So Your WAF Needs a Parser
 
Приемочные тесты на огурце
Приемочные тесты на огурцеПриемочные тесты на огурце
Приемочные тесты на огурце
 
Delegates and events in C#
Delegates and events in C#Delegates and events in C#
Delegates and events in C#
 
Blind Sql Injections. Хороши ли ваши тесты?
Blind Sql Injections. Хороши ли ваши тесты?Blind Sql Injections. Хороши ли ваши тесты?
Blind Sql Injections. Хороши ли ваши тесты?
 
Путь к чистому и компактному коду исполняемых спецификаций
Путь к чистому и компактному коду исполняемых спецификацийПуть к чистому и компактному коду исполняемых спецификаций
Путь к чистому и компактному коду исполняемых спецификаций
 

More from Igor Shkulipa

Общие темы. Тема 03.
Общие темы. Тема 03. Общие темы. Тема 03.
Общие темы. Тема 03.
Igor Shkulipa
 
Общие темы. Тема 01.
Общие темы. Тема 01.Общие темы. Тема 01.
Общие темы. Тема 01.
Igor Shkulipa
 
JavaScript Базовый. Занятие 06.
JavaScript Базовый. Занятие 06.JavaScript Базовый. Занятие 06.
JavaScript Базовый. Занятие 06.
Igor Shkulipa
 
JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.
Igor Shkulipa
 
JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.
Igor Shkulipa
 
JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.
Igor Shkulipa
 
JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.
Igor Shkulipa
 
JavaScript Базовый. Занятие 01.
JavaScript Базовый. Занятие 01.JavaScript Базовый. Занятие 01.
JavaScript Базовый. Занятие 01.
Igor Shkulipa
 
JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.
Igor Shkulipa
 
C# Web. Занятие 09.
C# Web. Занятие 09.C# Web. Занятие 09.
C# Web. Занятие 09.
Igor Shkulipa
 
C# Web. Занятие 08.
C# Web. Занятие 08.C# Web. Занятие 08.
C# Web. Занятие 08.
Igor Shkulipa
 
C# Web. Занятие 12.
C# Web. Занятие 12.C# Web. Занятие 12.
C# Web. Занятие 12.
Igor Shkulipa
 
C# Web. Занятие 16.
C# Web. Занятие 16.C# Web. Занятие 16.
C# Web. Занятие 16.
Igor Shkulipa
 
C# Web. Занятие 14.
C# Web. Занятие 14.C# Web. Занятие 14.
C# Web. Занятие 14.
Igor Shkulipa
 
C# Web. Занятие 15.
C# Web. Занятие 15.C# Web. Занятие 15.
C# Web. Занятие 15.
Igor Shkulipa
 
C# Web. Занятие 13.
C# Web. Занятие 13.C# Web. Занятие 13.
C# Web. Занятие 13.
Igor Shkulipa
 
C# Web. Занятие 11.
C# Web. Занятие 11.C# Web. Занятие 11.
C# Web. Занятие 11.
Igor Shkulipa
 
C# Web. Занятие 10.
C# Web. Занятие 10.C# Web. Занятие 10.
C# Web. Занятие 10.
Igor Shkulipa
 
C# Web. Занятие 05.
C# Web. Занятие 05.C# Web. Занятие 05.
C# Web. Занятие 05.
Igor Shkulipa
 
C# Web. Занятие 03.
C# Web. Занятие 03.C# Web. Занятие 03.
C# Web. Занятие 03.
Igor Shkulipa
 

More from Igor Shkulipa (20)

Общие темы. Тема 03.
Общие темы. Тема 03. Общие темы. Тема 03.
Общие темы. Тема 03.
 
Общие темы. Тема 01.
Общие темы. Тема 01.Общие темы. Тема 01.
Общие темы. Тема 01.
 
JavaScript Базовый. Занятие 06.
JavaScript Базовый. Занятие 06.JavaScript Базовый. Занятие 06.
JavaScript Базовый. Занятие 06.
 
JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.
 
JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.
 
JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.
 
JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.
 
JavaScript Базовый. Занятие 01.
JavaScript Базовый. Занятие 01.JavaScript Базовый. Занятие 01.
JavaScript Базовый. Занятие 01.
 
JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.
 
C# Web. Занятие 09.
C# Web. Занятие 09.C# Web. Занятие 09.
C# Web. Занятие 09.
 
C# Web. Занятие 08.
C# Web. Занятие 08.C# Web. Занятие 08.
C# Web. Занятие 08.
 
C# Web. Занятие 12.
C# Web. Занятие 12.C# Web. Занятие 12.
C# Web. Занятие 12.
 
C# Web. Занятие 16.
C# Web. Занятие 16.C# Web. Занятие 16.
C# Web. Занятие 16.
 
C# Web. Занятие 14.
C# Web. Занятие 14.C# Web. Занятие 14.
C# Web. Занятие 14.
 
C# Web. Занятие 15.
C# Web. Занятие 15.C# Web. Занятие 15.
C# Web. Занятие 15.
 
C# Web. Занятие 13.
C# Web. Занятие 13.C# Web. Занятие 13.
C# Web. Занятие 13.
 
C# Web. Занятие 11.
C# Web. Занятие 11.C# Web. Занятие 11.
C# Web. Занятие 11.
 
C# Web. Занятие 10.
C# Web. Занятие 10.C# Web. Занятие 10.
C# Web. Занятие 10.
 
C# Web. Занятие 05.
C# Web. Занятие 05.C# Web. Занятие 05.
C# Web. Занятие 05.
 
C# Web. Занятие 03.
C# Web. Занятие 03.C# Web. Занятие 03.
C# Web. Занятие 03.
 

C# Desktop. Занятие 13.

  • 1. Темы лекции: LINQ. Практическое задание: LINQ. Тренер: Игорь Шкулипа, к.т.н. Платформа .Net и язык программирования C#. Занятие 13
  • 2. http://www.slideshare.net/IgorShkulipa 2 LINQ Традиционно запросы к данным выражаются в виде простых строк без проверки типов при компиляции или поддержки IntelliSense. Кроме того, разработчику приходится изучать различные языки запросов для каждого из типов источников данных: баз данных SQL, XML- документов, различных веб-служб и т. д. LINQ делает запросы очень удобной конструкцией языков C# и Visual Basic. Разработчики создают запросы к строго типизированным коллекциям объектов с помощью зарезервированных слов языка и знакомых операторов. Language-Integrated Query (LINQ) - язык интегрированных запросов. LINQ позволяет извлекать информацию из различных источников данных. В основу LINQ положено понятие запроса, в котором определяется информация получаемая из источника данных. После формирования запроса происходит его выполнение. Запрос представляет собой выражение, извлекающее данные из источника данных. Запросы обычно выражаются на специальном языке запросов. Доступно несколько реализаций LINQ: LINQ to Objects, LINQ to SQL, LINQ to DataSet, LINQ to Entities и LINQ to XML.
  • 3. http://www.slideshare.net/IgorShkulipa 3 Пример class PersoneInfo { public string Name { get; set; } public string Surname { get; set; } public string Middle { get; set; } public DateTime BirthDate { get; set; } public override string ToString() { return String.Format ("{0} {1} {2} : {3}", Surname, Name, Middle, BirthDate); } }
  • 4. http://www.slideshare.net/IgorShkulipa 4 Пример static void Main(string[] args) { List<PersoneInfo> people = new List<PersoneInfo> { new PersoneInfo{ Name="Ivan", Surname="Ivanov", Middle="Ivanovich", BirthDate=DateTime.Parse("1/1/1980")}, new PersoneInfo{ Name="Petr", Surname="Petrov", Middle="Petrovich", BirthDate=DateTime.Parse("2/2/1990")}, new PersoneInfo{ Name="Sidor", Surname="Sidorov", Middle="Sidorovich", BirthDate=DateTime.Parse("3/3/1985")} };
  • 5. http://www.slideshare.net/IgorShkulipa 5 Пример var resultQuery1 = from persone in people where persone.BirthDate > DateTime.Parse("1/1/1985") orderby persone.Surname, persone.Name select new { Name = persone.Name, Surname = persone.Surname }; var resultQuery2 = from persone in people where persone.BirthDate > DateTime.Parse("1/1/1985") orderby persone.Surname, persone.Name select persone; foreach (var per in resultQuery1) { Console.WriteLine(per.ToString()); } foreach (var per in resultQuery2) { Console.WriteLine(per.ToString()); } Console.ReadKey(); } { Name = Petr, Surname = Petrov } { Name = Sidor, Surname = Sidorov } Petrov Petr Petrovich : 02.02.1990 0:00:00 Sidorov Sidor Sidorovich : 03.03.1985 0:00:00
  • 6. http://www.slideshare.net/IgorShkulipa 6 Расширяющие методы и лямбда-выражения В пространстве имен System.Linq есть два статический класса, которые содержат множество расширяющих методов – Enumerable и Queryable. Классы Enumerable и Queryable предоставляют набор расширяющих методов для интерфейсов IEnumerable и IQueryable соответственно. Имена этих расширяющих методов совпадают с именами конструкций запросов. Это не случайно, так как, в действительности, эти методы реализуют операции запросов LINQ. Интерфейс IQueryable предназначен для реализации поставщиками запросов. Он реализуется только поставщиками, которые также реализуют интерфейс IQueryable<T>. Если поставщик не реализует IQueryable<T>, для его источника данных не могут использоваться стандартные операторы запросов. Интерфейс IQueryable наследует интерфейс IEnumerable, поэтому если он представляет запрос, результаты этого запроса будут допускать перечисление.
  • 7. http://www.slideshare.net/IgorShkulipa 7 Тот же пример с расширяющими методами var resultQuery3 = people .Where(persone => persone.BirthDate > DateTime.Parse("1/1/1985")) .OrderBy(persone => persone.Surname) .OrderBy(persone => persone.Name) .Select(persone => new { Name = persone.Name, Surname = persone.Surname }); var resultQuery4 = people .Where(persone => persone.BirthDate > DateTime.Parse("1/1/1985")) .OrderBy(persone => persone.Surname) .OrderBy(persone => persone.Name) .Select(persone => persone); foreach (var per in resultQuery3) { Console.WriteLine(per.ToString()); } foreach (var per in resultQuery4) { Console.WriteLine(per.ToString()); } { Name = Petr, Surname = Petrov } { Name = Sidor, Surname = Sidorov } Petrov Petr Petrovich : 02.02.1990 0:00:00 Sidorov Sidor Sidorovich : 03.03.1985 0:00:00
  • 8. http://www.slideshare.net/IgorShkulipa 8 Синтаксис LINQ Каждое выражение запроса начинается с конструкции from, которая объявляет переменную диапазона. Конструкция from, похожа на оператор foreach в том, что она осуществляет итерацию по элементам коллекции people, сохраняя на каждом шаге очередной элемент коллекции в переменной persone. После конструкции from следуют различные операции запроса для фильтрации данных переменной диапазона. В примере применяются операции where и orderby. Выражение закрывается операцией проекции (select). Применение операции проекции обычно приводит к созданию новой коллекции – результата выполнения запроса. 101 LINQ Samples Основные конструкции LINQ
  • 9. http://www.slideshare.net/IgorShkulipa 9 Ключевые слова запросов LINQ from, join, where, group, into, let, ascending, descending, on, equals, in, orderby, select
  • 10. http://www.slideshare.net/IgorShkulipa 10 Конструкция from Каждый запрос начинается с конструкции from. Конструкция from – это генератор, который определяет переменную диапазона - локальную переменную, используемую для представления каждого элемента входной коллекции, по мере применения к ней выражения запроса. Выражения запроса может содержать более одной конструкции from. Пример – генерация таблицы умножения. var multTable = from a in Enumerable.Range(1, 10) from b in Enumerable.Range(1, 10) select new { A = a, B = b, AB = a * b }; foreach (var item in multTable) { Console.WriteLine("{0}*{1}={2}", item.A, item.B, item.AB); } 1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 ... 10*6=60 10*7=70 10*8=80 10*9=90 10*10=100
  • 11. http://www.slideshare.net/IgorShkulipa 11 Конструкция join Конструкция join может использоваться для сопоставления данных из двух различных источников. class PersoneInfo { public string Name { get; set; } public string Surname { get; set; } public string Middle { get; set; } public DateTime BirthDate { get; set; } public string NationalityID { get; set; } public override string ToString() { return String .Format("{0} {1} {2} : {3}", Surname, Name, Middle, BirthDate); } } class PersoneNationality { public string ID { get; set; } public string Name { get; set; } }
  • 12. http://www.slideshare.net/IgorShkulipa 12 Пример join List<PersoneInfo> people = new List<PersoneInfo> { new PersoneInfo{ Name="Ivan", Surname="Ivanov", Middle="Ivanovich", NationalityID="222", BirthDate=DateTime.Parse("1/1/1980")}, new PersoneInfo{ Name="Petr", Surname="Petrov", Middle="Petrovich", NationalityID="111", BirthDate=DateTime.Parse("2/2/1990")}, new PersoneInfo{ Name="Sidor", Surname="Sidorov", Middle="Sidorovich", NationalityID="111", BirthDate=DateTime.Parse("3/3/1985")} }; List<PersoneNationality> nationalities = new List<PersoneNationality> { new PersoneNationality{ ID= "111", Name="Ukraine"}, new PersoneNationality{ ID="222", Name="Russian"} };
  • 13. http://www.slideshare.net/IgorShkulipa 13 Пример join var resultQuery = from persone in people join nation in nationalities on persone.NationalityID equals nation.ID orderby nation.Name descending select new { Name = persone.Name, Surname = persone.Surname, Middle = persone.Middle, Nationality = nation.Name }; foreach (var per in resultQuery) { Console.WriteLine("{0} {1} {2} - {3}", per.Surname, per.Name, per.Middle, per.Nationality); } Petrov Petr Petrovich - Ukraine Sidorov Sidor Sidorovich - Ukraine Ivanov Ivan Ivanovich - Russian
  • 14. http://www.slideshare.net/IgorShkulipa 14 Конструкция where Конструкция where – это конструкция фильтров. Она следует за конструкциями from и join. Фильтры состоят из ключевого слова where, за которым следует выражение условия. var resultQuery1 = from persone in people where persone.BirthDate > DateTime.Parse("1/1/1985") orderby persone.Surname, persone.Name select new { Name = persone.Name, Surname = persone.Surname }; var resultQuery2 = from persone in people where persone.BirthDate > DateTime.Parse("1/1/1985") orderby persone.Surname, persone.Name select persone;
  • 15. http://www.slideshare.net/IgorShkulipa 15 Конструкция orderby Конструкция orderby используется для сортировки результатов запроса. За ключевым словом orderby следует элемент, по значению которого должна проводиться сортировка, обычно это какое-то свойство переменной диапазона. Сортировку можно выполнять как в порядке возрастания (ascending) так и в порядке убывания (descending). Если ключевое слово явно не указано, то принимается сортировка по возрастанию (ascending). var resultQuery = from persone in people join nation in nationalities on persone.NationalityID equals nation.ID orderby nation.Name descending, persone.Name ascending, persone.Surname select new { Name = persone.Name, Surname = persone.Surname, Middle = persone.Middle, Nationality = nation.Name };
  • 16. http://www.slideshare.net/IgorShkulipa 16 Конструкция select Конструкция select служит для производства конечного результата запроса. Она называется проектором, по этому проектирует (транслирует) данные внутри запроса в форму, удобную для применения. Компилятор преобразует конструкцию select в вызов расширяющего метода Select. Тело конструкции select преобразуется в лямбда- выражение, передаваемое методу Select, который использует его для производства каждого элемента результирующего набора. var multTable = from a in Enumerable.Range(1, 10) from b in Enumerable.Range(1, 10) select new { A = a, B = b, AB = a * b };
  • 17. http://www.slideshare.net/IgorShkulipa 17 Конструкция let Конструкция let предоставляет новый локальный идентификатор, на который можно ссылаться в следующей части запроса. var letQuery = from persone in people let fullName = persone.Name + " " + persone.Middle + " " + persone.Surname orderby fullName descending select fullName; foreach (var fname in letQuery) { Console.WriteLine(fname); } Sidor Sidorovich Sidorov Petr Petrovich Petrov Ivan Ivanovich Ivanov
  • 18. http://www.slideshare.net/IgorShkulipa 18 Конструкция group Конструкция gourp является средством для разбиения входных данных запроса на части. Конструкция gourp - это проектор, который проектирует данные в коллекцию интерфейсов IGrouping. Интерфейс IGrouping определен в пространстве имен System.Linq и унаследован от IEnumerable. По этому IGrouping можно применять везде, где можно применять IEnumerable. Интерфейс IGrouping включает свойство по имени Key, которое является объектом, описывающим подмножество. Каждый результирующий набор формируется применением операции эквивалентности к входным данными Key.
  • 19. http://www.slideshare.net/IgorShkulipa 19 Пример group var groupQuery = from number in Enumerable.Range(0, 50) group number by number % 2; foreach (var group in groupQuery) { Console.WriteLine("nmod2={0}", group.Key); foreach (var number in group) { Console.Write("{0}, ", number); } } mod2=0 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, mod2=1 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49,
  • 20. http://www.slideshare.net/IgorShkulipa 20 Конструкция into Конструкция into подобна использованию конструкции let в том, что она определяет локальную переменную внутри запроса. Использование конструкции into сообщает компилятору о присвоении результата конструкций group или join в локальную переменную, которая будет использоваться позднее в следующей части запроса. Конструкцию into еще называют конструкцией продолжения, поскольку конструкции group и into не являются окончанием запроса. Конструкцию into так же работает как генератор, подобно конструкции from и идентификатор, предоставленный into во многом подобен переменной диапазона from.
  • 21. http://www.slideshare.net/IgorShkulipa 21 Пример into var intoQuery = from number in Enumerable.Range(0, 50) group number by number % 2 into groups select new { Key = groups.Key, Count = groups.Count(), Numbers = groups }; foreach (var item in intoQuery) { Console.WriteLine("nmod2={0}", item.Key); Console.WriteLine("Count={0}", item.Count); foreach (var number in item.Numbers) { Console.Write("{0}, ", number); } } var intoQuery = from number in Enumerable.Range(0, 50) group number by number % 2 into groups where groups.Key == 0 select new { Key = groups.Key, Count = groups.Count(), Numbers = groups }; mod2=0 Count=25 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, mod2=0 Count=25 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, mod2=1 Count=25 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49,
  • 22. http://www.slideshare.net/IgorShkulipa 22 Пример LINQ запроса Dictionary<string, List<string>> dictionary = new Dictionary<string, List<string>> { {"привет", new List<string>{"пирвет", "првиет", "првет"}}, {"пока", new List<string>{"поак", "пка"}}, {"дела", new List<string>{"деал", "дила", "дла", "дкла"}}, {"хорошо", new List<string>{"хрошо", "хоршо", "хроошо"}}, {"удачи", new List<string>{"удкчи", "уадчи", "удачм"}} }; string wrongText = "n- пирвет! как деал?n" + "- првиет! дила хоршо.n" + "- хрошо, удачм.n" + "- поак.n";
  • 23. http://www.slideshare.net/IgorShkulipa 23 Пример LINQ запроса string[] words = wrongText.Split(new char[] { ' ', '!', '.', ',', '?', '-' }); var correctDict = from dict in dictionary let wrongWords = dict.Value from val in wrongWords join word in words on val equals word select new { WrongWord = word, CorrectWord = dict.Key }; string correctText = wrongText; foreach (var item in correctDict) { correctText = correctText.Replace(item.WrongWord, item.CorrectWord); } Console.WriteLine("Wrong Text: {0}", wrongText); Console.WriteLine("Correct Text: {0}", correctText); Wrong Text: - пирвет! как деал? - првиет! дила хоршо. - хрошо, удачм. - поак. Correct Text: - привет! как дела? - привет! дела хорошо. - хорошо, удачи. - пока.
  • 24. http://www.slideshare.net/IgorShkulipa 24 LINQ to Objects Термином "LINQ to Objects" называют использование запросов LINQ непосредственно с коллекциями IEnumerable или IEnumerable<T> без промежуточных поставщиков LINQ или API-интерфейсов, таких как LINQ to SQL или LINQ to XML. LINQ можно использовать для запроса любых перечислимых коллекций, таких как List<T>, Array или Dictionary<TKey, TValue>. По сути, LINQ to Objects представляет новый подход к коллекциям. Раньше нужно было писать сложные циклы foreach, которые определяли способ извлечения данных из коллекции. При применении подхода LINQ создается декларативный код с описанием необходимых извлекаемых данных. Кроме того, запросы LINQ имеют три основных преимущества перед традиционными циклами foreach. • Они более компактные и удобочитаемые, особенно при фильтрации по нескольким условиям. • Они предоставляют мощные возможности фильтрации, упорядочивания и группировки с минимальным объемом кода приложения. • Они могут быть перенесены на другие источники данных с минимальными изменениями или без изменений. В общем случае, чем более сложные операции следует выполнить над данными, тем больше преимуществ от применения LINQ вместо использования традиционных методов итераций. Ссылка на раздел MSDN
  • 25. http://www.slideshare.net/IgorShkulipa 25 LINQ to Entities LINQ to Entities обеспечивает поддержку LINQ при запросах к сущностям. Компонент позволяет разработчикам писать запросы к концептуальной модели Entity Framework на языке Visual Basic или Visual C#. Запросы к платформе Entity Framework представляются в виде дерева команд запроса, выполняемого на контексте объектов. Технология LINQ to Entities преобразует запросы LINQ в запросы в виде дерева команд, выполняет эти запросы на платформе Entity Framework и возвращает объекты, которые могут использоваться как платформой Entity Framework, так и технологией LINQ. Ссылка на раздел MSDN
  • 26. http://www.slideshare.net/IgorShkulipa 26 LINQ to DataSet LINQ to DataSet упрощает и ускоряет выполнение запросов к данным, кэшированным в объекте DataSet. В особенности LINQ to DataSet упрощает создание запросов, позволяя писать их непосредственно на языке программирования, а не применять отдельный язык запросов. Использование метода Select для выборки всех строк из таблицы Product и отображения названий продуктов. // Fill the DataSet. DataSet ds = new DataSet(); ds.Locale = CultureInfo.InvariantCulture; FillDataSet(ds); DataTable products = ds.Tables["Product"]; IEnumerable<DataRow> query = from product in products.AsEnumerable() select product; Console.WriteLine("Product Names:"); foreach (DataRow p in query) { Console.WriteLine(p.Field<string>("Name")); } Ссылка на раздел MSDN
  • 27. http://www.slideshare.net/IgorShkulipa 27 LINQ to XML LINQ to XML обеспечивает интерфейс программирования для работы с XML в памяти на основе платформы .NET LINQ Framework. LINQ to XML использует новейшие возможности языка платформы .NET Framework и может быть сравним с обновленным, переработанным программным интерфейсом XML модели DOM. Пример: как найти элемент с определенным атрибутом. XElement root = XElement.Load("PurchaseOrder.xml"); IEnumerable<XElement> address = from el in root.Elements("Address") where (string)el.Attribute("Type") == "Billing" select el; foreach (XElement el in address) Console.WriteLine(el); Ссылка на раздел MSDN
  • 28. http://www.slideshare.net/IgorShkulipa 28 LINQ to SQL LINQ to SQL является компонентом .NET Framework, предоставляющим инфраструктуру времени выполнения для управления реляционными данными как объектами. В LINQ to SQL модель данных реляционной базы данных сопоставляется объектной модели, выраженной в языке программирования разработчика. При запуске приложения LINQ to SQL преобразует запросы LINQ из объектной модели в SQL и отправляет их в базу данных для выполнения. Когда база данных возвращает результаты, LINQ to SQL преобразует их обратно в объекты, с которыми можно работать на собственном языке программирования. Ссылка на раздел MSDN
  • 29. http://www.slideshare.net/IgorShkulipa 29 Лабораторная работа №13. LINQ В индивидуальном курсовом проекте, реализовать доступ к данным с помощью LINQ: • если используется база данных – LINQ to SQL • если используется XML – LINQ to XML • для итерации по коллекциям, по возможности использовать LINQ to Objects