СиППО (25-28, 42-45, 54-76) (987679), страница 9
Текст из файла (страница 9)
Console.Write(n+”|”); //Dick|Harry|
Поскольку стандартные операторы запроса реализованы в виде методов расширения, мы можем вызвать Where непосредственно для массива names так, словно это метод экземпляра:
IEnumerable<string> filteredNames = names.Where (n => n.Length >= 4);
Чтобы можно было откомпилировать эту строчку, вы должны импортировать пространство имен System.Linq. Вот полный код примера:
using System;
using System.Linq;
class LinqDemo {
static void Main() {
string[] names = {“Tom”, “Dick”, “Harry” };
IEnumerable<string> filteredNames = names.Where (n => n.Length >= 4);
foreach (string name in filteredNames) Console.Write (name+ “|”);
}} // Результат: Dick|Harry|
Мы могли бы еще больше сократить запрос с помощью неявного приведения типа переменной filteredNames:
var filteredNames = names.Where (n => n.Length >= 4);
Большинство операторов запроса принимает лямбда-выражение в качестве аргумента. Лямбда-выражение помогает направить и сформировать запрос. В нашем примере лямбда-выражение выглядит так:
n => n.Length >= 4.
Входной аргумент соответствует входному элементу. В этом случае аргумент n представляет имя в массиве и имеет тип string. Оператор Where требует, чтобы лямбда-выражение возвращало значение типа bool. Когда оно истинно, элемент должен быть включен в исходную последовательность.
Такие запросы называются лямбда-запросами. В языке C# имеется специальный синтаксис для написания запросов, и он называется синтаксисом, облегчающим восприятие запроса. Предыдущий пример, переписанный в соответствии с эти синтаксисом:
IEnumerable<string> filteredNames =
from n in names
where n.Contains(“a”)
select n;
Лямбда-синтаксис и синтаксис, облегчающий восприятие, дополняют друг друга.
74. Обработка данных из стандартного класса List средствами LINQ
Допустим, перед нами стоит тривиальная с точки зрения программирования задача: необходимо сделать выборку данных из некоего массива (скажем, содержащего натуральные числа) по определенному критерию (только четные), а результат вывести в упорядоченном виде.
Традиционный подход предусматривает просмотр массива посредством цикла, выбор элементов, удовлетворяющих критерию, а затем их сортировку (или постепенное добавление в заведомо упорядоченный список). Реализацию в виде консольной программы демонстрирует Листинг 1 (код в комментариях не нуждается, разве что следует обратить внимание, что для сохранения результатов в виде типизированного списка использовались появившиеся в .NET 2.0 обобщения).
В реляционных СУБД (благодаря SQL) подобные задачи решаются куда элегантнее: вместо последовательного перебора данных достаточно описать искомый результат, а декларативный стиль запроса позволяет «уместить» в нем сразу несколько действий. То же самое, по сути, обеспечивает и LINQ. В Листинге 2 цикл для выборки элементов по критерию и последующей сортировки результата заменяет всего одна конструкция, которая по форме и ключевым словам очень сильно напоминает SQL – это и есть LINQ-запрос.
static void Main(string[] args){int[] arr = { 10, 5, 13, 18, 4, 24, 65, 41, 30 }; List<int> evens = new List<int>(); foreach (var number in arr){if (number % 2 == 0)evens.Add(number);} evens.Sort(); foreach (int number in evens)Console.WriteLine(number);}
Выборка и формирование упорядоченного списка элементов массива с применением LINQstatic void Main(string[] args){int[] arr = { 10, 5, 13, 18, 4, 24, 65, 41, 30 }; var evens =from number in arrwhere number % 2 == 0orderby numberselect number; foreach (int number in evens)Console.WriteLine(number); }
Добавление источника данных (еще пример):
public class Student
{
public string First { get; set; }
public string Last { get; set; }
public int ID { get; set; }
public List<int> Scores;
}
// Create a data source by using a collection initializer.
static List<Student> students = new List<Student>
{
new Student {First="Svetlana", Last="Omelchenko", ID=111, Scores= new List<int> {97, 92, 81, 60}},
new Student {First="Claire", Last="O’Donnell", ID=112, Scores= new List<int> {75, 84, 91, 39}},
new Student {First="Sven", Last="Mortensen", ID=113, Scores= new List<int> {88, 94, 65, 91}},
new Student {First="Cesar", Last="Garcia", ID=114, Scores= new List<int> {97, 89, 85, 82}},
new Student {First="Debra", Last="Garcia", ID=115, Scores= new List<int> {35, 72, 91, 70}},
new Student {First="Fadi", Last="Fakhouri", ID=116, Scores= new List<int> {99, 86, 90, 94}},
new Student {First="Hanying", Last="Feng", ID=117, Scores= new List<int> {93, 92, 80, 87}},
new Student {First="Hugo", Last="Garcia", ID=118, Scores= new List<int> {92, 90, 83, 78}},
new Student {First="Lance", Last="Tucker", ID=119, Scores= new List<int> {68, 79, 88, 92}},
new Student {First="Terry", Last="Adams", ID=120, Scores= new List<int> {99, 82, 81, 79}},
new Student {First="Eugene", Last="Zabokritski", ID=121, Scores= new List<int> {96, 85, 91, 60}},
new Student {First="Michael", Last="Tucker", ID=122, Scores= new List<int> {94, 92, 91, 91} }
};
// studentQuery is an IEnumerable<Student>
var studentQuery =
from student in students
where student.Scores[0] > 90
select student;
MSDN
75. Принципы стыковки Visual Studio с базами данных
Visual Studio предоставляет средства для подключения приложения к данным из разнообразных источников, таких как базы данных, веб-службы и объекты. При использовании средств разработки структуры данных в Visual Studio часто не требуется явно создавать объект подключения для формы или компонента. Объект подключения обычно создается в результате завершения одного из мастеров данных или перетаскивания объектов данных на форму. Чтобы подключить приложение к данным в базе данных, веб-службе или объекте, запустите Мастер конфигурации источников данных, выбрав элемент Добавить новый источник данных в Окно "Источники данных".
В следующей диаграмме показан стандартный набор операций при подключении к данным при помощи запроса к адаптеру таблиц для выборки данных и их отображения на форме приложения Windows.
При использовании Visual Studio подключения настроены с помощью Диалоговое окно "Добавить/Изменить подключение" (вкладка "Общие"). Диалоговое окно Добавить подключение появляется при редактировании или создании соединений в одном из мастеров данных, в Обозревателе серверов/Обозревателе баз данных или при изменении свойств соединения в окне Свойства.
Подключения данных автоматически настраиваются при выполнении одного из следующих действий:
Действие | Описание |
Запуск Мастер конфигурации источников данных. | Подключения настраиваются при выборе пути к базе данных в Мастере настройки источника данных. Дополнительные сведения см. в разделе Практическое руководство. Подключение к данным в базе данных. |
Запуск Мастер настройки адаптера таблицы. | Подключения создаются в Мастере конфигурации адаптера таблицы. Дополнительные сведения см. в разделе Практическое руководство. Создание адаптера таблицы. |
Запуск Мастер настройки запроса адаптера таблицы. | Подключения создаются в Мастере конфигурации запросов к адаптеру таблиц. Дополнительные сведения см. в разделе Практическое руководство. Создание запросов TableAdapter. |
Перетаскивание элементов из Окно "Источники данных" на форму Конструктор компонентов. | Объекты подключения создаются при перетаскивании элементов из окна Источники данных вWindows Forms Designer или Конструктор компонентов. Дополнительные сведения см. в разделе Отображение данных на форме в приложениях Windows. |
Добавление новых подключений к данным в Обозревателе серверов/Обозревателе баз данных. | Подключения к данным в Обозревателе серверов/Обозревателе баз данных отображаются в списке доступных подключений в мастерах данных. Дополнительные сведения см. в разделе Практическое руководство. Добавление новых подключений к данным в Обозревателе серверов/Обозревателе баз данных. |
Двумя основными способами подключений являются Open и Close. В методе Open используются сведения свойства ConnectionStringдля связи с источником данных и установки открытого подключения. Метод Close завершает подключение. Закрытие подключений необходимо, поскольку большинство источников данных поддерживают только ограниченное число открытых подключений и на открытые подключения отвлекаются ценные системные ресурсы.
При работе с Адаптер таблицы, DataAdapter или командами данных нет необходимости явно открывать и закрывать подключение. При вызове метода этих объектов (например, Fill или Update), метод проверяет наличие уже открытого подключения. Если подключение не открыто, адаптер открывает его, выполняет свои операции и вновь закрывает.
Методы, подобные методу Fill, открывают и закрывают подключение автоматически только в том случае, если оно еще не открыто. Если подключение открыто, методы используют его, но не закрывают. Это позволяет пользователю самостоятельно открывать или закрывать подключения. Это также можно делать, если имеется несколько адаптеров данных, которые совместно используют подключение. В этом случае открывать и закрывать подключение из каждого адаптера при вызове метода Fill было бы неэффективно. Вместо этого пользователь может открыть подключение, вызвать методы Fill для каждого адаптера, а затем закрыть подключение после завершения работы.
Подключение приложения к базе данных Microsoft Access происходит с помощью поставщика платформы .NET Framework для OleDB. Дополнительные сведения см. в разделе Общие сведения о локальных данных.
При подключении к данным в локальных файлах важно понять, как система работы с проектами в Visual Studio управляет этими файлами. Дополнительные сведения см. в разделе Практическое руководство. Управление локальными файлами данных в проекте.
Неважно, создается подключение данных в одном из мастеров данных или в Обозревателе серверов/Обозревателе баз данных, в любом случае процесс определения подключения одинаков; нужно выбрать источник данных в Диалоговые окна "Выбор источника данных" и "Смена источника данных" и добавить сведения о подключении в Диалоговое окно "Добавить/Изменить подключение" (вкладка "Общие").