Грамматика синтаксиса запросов в C#

Лекции по предмету «Программирование»
Информация о работе
  • Тема: Грамматика синтаксиса запросов в C#
  • Количество скачиваний: 8
  • Тип: Лекции
  • Предмет: Программирование
  • Количество страниц: 6
  • Язык работы: Русский язык
  • Дата загрузки: 2015-01-04 00:07:15
  • Размер файла: 37.12 кб
Помогла работа? Поделись ссылкой
Информация о документе

Документ предоставляется как есть, мы не несем ответственности, за правильность представленной в нём информации. Используя информацию для подготовки своей работы необходимо помнить, что текст работы может быть устаревшим, работа может не пройти проверку на заимствования.

Если Вы являетесь автором текста представленного на данной странице и не хотите чтобы он был размешён на нашем сайте напишите об этом перейдя по ссылке: «Правообладателям»

Можно ли скачать документ с работой

Да, скачать документ можно бесплатно, без регистрации перейдя по ссылке:

Грамматика синтаксиса запросов в C#

Выражения запросов должны подчиняться перечисленным ниже правилам:
1. С левой стороны от знака равенства объявляется переменная для размещения результата запроса. Тип переменной Enumerable<T> или var.
2. Справа от знака равенства записывается выражение, которое должно начинаться с конструкции from. После ключевого слова from записывается произвольное имя так называемой «переменной диапазона», в которую будет извлекаться очередной элемент из таблицы или списка. Тип этой переменной задает компилятор. Переменная диапазона так называется потому, что она задает состав и длину извлекаемого элемента (символ, число, строка таблицы). Смысл переменной диапазона – обеспечить возможность извлечения не только строк таблицы целиком, но и их частей - отдельных ячеек в столбцах. Эта переменная похожа на переменную итерации в операторе цикла foreach и отличается тем, что может состоять из части элемента списка. В целом выражение запроса может иметь такой вид:
var strs = from p in Person select p;
3. Выражение может содержать необязательные конструкции from, let или where. Конструкция from — это генератор, который объявляет одну или более переменных диапазона, перечисляющих последовательность или соединение нескольких последовательностей. Конструкция let представляет переменную диапазона и присваивает ей значение. Конструкция where фильтрует элементы из входной последовательности или соединяет несколько входных последовательностей в выходную последовательность.
4. Остальная часть выражения запроса может включать конструкцию orderby, содержащую одно или более полей сортировки с необязательным направлением упорядочивания. Направлением может быть ascending (по возрастанию) или descending (по убыванию).
5. В оставшейся части выражения может идти конструкция select или group.
6. Наконец в оставшейся части выражения может следовать необязательная конструкция продолжения. Такой конструкцией может быть либо into, ноль или более конструкций join, или же другая повторяющаяся последовательность перечисленных элементов, начиная с конструкций из правила 2. Конструкция into направляет результаты запроса в воображаемую выходную последовательность, которая служит конструкцией from для последующих выражений запросов, начиная с конструкций из правила 2.
Если сформировано синтаксически правильное выражение запроса, компилятор транслирует это выражение запроса в код C#, используя синтаксис методов. Далее рассматривается, как синтаксис методов, так и синтаксис запросов.
Описание запросов LINQ
Запросы в LINQ имеют множество конструкций, поэтому целесообразно их рассматривать группами по назначению.
Проекция и фильтрация
Операции проекции и фильтрации передают в выходную коллекцию частично или полностью входную коллекцию.
Операция Select позволяет выбрать из входной коллекции элементы выходной последовательности. Типы входных и выходных элементов могут различаться. Например, если выходная коллекция состоит из объектов некоторого класса (типизированный набор данных), то на выходе можно получить как коллекцию объектов того же типа, так и просто список, содержащий значения одного или нескольких полей объекта.
Существуют два прототипа этой операции, которые описаны ниже: (пр)
Первый прототип Select
public static IEnumerable<S> Select<T, S>( this IEnumerable<T> source,
Func<T, S> selector);
Этот прототип Select принимает входную последовательность и делегат метода-селектора в качестве входных параметров, а возвращает объект, который при перечислении проходит по входной последовательности и выдает последовательность элементов типа S. Как упоминалось ранее, Т и S могут быть как одного, так и разных типов.
Примеры записи оператора Select:
var query = lst.Select(p => p.name);
Здесь p – входная последовательность, а p.name - селектор для формирования выходной последовательности (задает выборку не всего объекта, а только одно поле).
При вызове Select делегат метода-селектора передается в аргументе selector. Метод-селектор должен принимать тип Т в качестве входного, где Т — тип элементов, содержащихся во входной последовательности, и возвращать элемент типа S. Операция Select вызовет метод-селектор для каждого элемента входной последовательности, передав ему этот элемент. Метод-селектор выберет интересующую часть входного элемента, создаст новый элемент — возможно, другого типа (даже анонимного) — и вернет его. Таким образом, в приведенном выше примере будет возвращено поле name из объекта p.
Второй прототип Select
public static IEnumerable<S> Select<T, S>(this IEnumerable<T> source,
Func<T, int, S> selector);
В этом прототипе операции Select методу-селектору передается дополнительный целочисленный параметр. Это индекс, начинающийся с нуля, входного элемента во входной последовательности.
Пример выборки из списка объектов типа перечня профессий:
class Program
{
class Block
{
public string prof { get; set; }
public string name { get; set; }
public string secname { get; set; }
public int skil;
public double wage;
public Block() { } // Конструктор пустой
public Block(string p, string s, string sn, int k, double w)
{
prof = p;
name = s;
secname = sn;
skil = k;
wage = w;
}
}
static void Main(string[] args)
{
StreamReader file = new StreamReader("C:\Temp\blocks.txt",
Encoding.Default);
string s;
int sk;
double wg;
string[ ] str;
Block blk = new Block();
List<Block> lst = new List<Block>();
//
while ((s = file.ReadLine()) != null)
{
str = s.Split( );
sk = int.Parse(str[3]);
wg = double.Parse(str[4]);
lst.Add(new Block(str[0], str[1], str[2], sk, wg));
}
Console.WriteLine("Начальный список");
foreach (Block bl in lst) // Вывод начального списка
Console.WriteLine("{0,-12} {1,-8} {2} {3}",
bl.prof, bl.name, bl.skil, bl.wage);
Console.WriteLine("
Выборка по профессии");
// в Select задано поле для выборки
var blQuery = lst.Select(p => p.prof);// Возврат списка профессий
foreach (var pr in blQuery)
{
Console.WriteLine(pr);
}
Console.ReadKey();
}
}
В примере использован синтаксис методов. Этот же пример с использованием синтаксиса запросов будет иметь вид:
var blQuery = from pp in lst
select pp.prof;
Результат выполнения программы имеет вид

Запрос можно видоизменить (синтаксис методов):
var blQuery = lst.Select(p => p);// Возврат списка объектов типа Block
То же по синтаксису запросов:
var blQuery = from pp in lst
select pp;
Но тогда для вывода поля требуется нотация с точкой: Console.WriteLine(pr.prof);
Можно выполнить фильтрацию списка. Например, для выборки из списка всех токарей фрагмент программы приобретает вид:
var blQuery = lst.Where(t => t.prof == "токарь");// Создается новый список
То же по синтаксису запросов
var blQuery = from pp in lst
where pp.prof == "токарь"
select pp;
Обратите внимание условие (pp.prof == "токарь") записано в синтаксисе языка C#, а не синтаксисе языка SQL. (Для сравнения записаны два знака равенства)
Console.WriteLine("
Список токарей");
foreach (var pr in blQuery)
{
Console.WriteLine(" {0}",pr.name);
}
Результат выполнения программы имеет вид:

Размером возвращаемого списка можно управлять. Для этого применяются конструкции:
• Take возвращает указанное количество элементов из входной последовательности, начиная с ее начала
• TakeWhile возвращает элементы из входной последовательности, пока истинно некоторое условие, начиная с начала последовательности. Остальные входные элементы пропускаются.
• Skip пропускает указанное количество элементов из входной последовательности, начиная с ее начала, и выводит остальные.
• SkipWhile обрабатывает входную последовательность, пропуская элементы до тех пор, пока условие истинно, а затем выводит остальные в выходную последовательность.
Пример использования конструкции Take
var blQuery = lst.Where(t => t.prof == "токарь").Take(1);//
То же по синтаксису запросов
var blQuery = (from pp in lst
where pp.prof == "токарь" select pp).Take(1);
Из полученного списка выбирает первую позицию. Обратите внимание: синтаксис запросов заключен в круглые скобки.
Ниже приведен пример выборки списка токарей с уровнем заданной зарплаты
var blQuery = lst.Where(t => t.prof == "токарь").TakeWhile(t =>t.wage<40);//
То же по синтаксису запросов
var blQuery = (from pp in lst
where pp.prof == "токарь" select pp).TakeWhile(t => t.wage < 40);
Из отсортированного списка выбирает токарей по уровню зарплаты (изменен вывод).
Console.WriteLine("Список токарей с зарплатой меньше 40 тысяч руб.");
foreach (var pr in blQuery)
{
Console.WriteLine(" {0} зарплата {1}",pr.name, pr.wage);
}
Результат выполнения программы имеет вид:

Аналогично применяются конструкции Skip и SkipWhile. В этом случае выполняется пропуск либо заданного количества позиций, либо пропуск осуществляется до тех пор, пока выполняется заданное условие.
FirstOrDefault (LastOrDefault)
Операция First вызывает исключительную ситуацию, если элемент не найден.
П)Операция FirstOrDefault подобна First во всем, кроме поведения, когда элемент не найден (возвращает значение null). Эта операция имеет два прототипа, описанные ниже:
Первый прототип FirstOrDefault
public static Т FirstOrDefault<T> (this IEnumerable<T> source);
Эта версия прототипа FirstOrDefault возвращает первый элемент, найденный во входной последовательности. Если последовательность пуста, возвращается default(Т). Для типов ссылочных и допускающих значение null по умолчанию является null.
Второй прототип FirstOrDefault
Второй прототип операции FirstOrDefault позволяет передать predicate, определяющий, какой элемент следует возвратить.
public static Т FirstOrDefault<T>(
this IEnumerable<T> source,
Func<T, bool> predicate);
Операция LastOrDefault аналогична FirstOrDefault, но вместо первого элемента выбирает последний.
Код ниже, содержит пример использования операции LastOrDefault для обоих прототипов, в том числе, когда элемент не найден. (Использован список, который применялся в примере «Группировка»):
var aut = lst.LastOrDefault();// Выборка самого последнего элемента
Console.WriteLine("Выбор последнего элемента в списке
" + aut.dAw);
// Выборка последнего элемента на букву "М"
var aut1 = lst.LastOrDefault(p => p.dAw.StartsWith("М"));
Console.WriteLine("
Выбор последнего элемента в списке (с условием)
"
+ aut1.dAw);
Результат выполнения фрагмента кода:

Если с помощью операции Таке выбирается последовательность, то после нее можно добавить операцию FirstOrDefault или LastOrDefault (через точку).