Шпаргалка по LINQ и SQL
Шпаргалка по LINQ и SQL, смотрите так же:
Linq
Последовательность, - любая коллекция, реализующая интерфейс IEnumerable<> или IQueryable<>. Оператор запроса - метод, преобразующий последовательность. Запрос - выражение, которое преобразует последовательность с помощью операторов запроса.
Синтаксис
LINQ поддерживает два вида синтаксиса: синтаксис запросов и синтаксис методов
Синтаксис запросов:
int[] MyArray = { -1, 2, 3, -4 };
var res = from n in MyArray
where n > 0
select n; // 2, 3
Такой синтаксис всегда должен начинаться с from in и заканчиваться select или group. Синтаксис методов:
int[] array = { -5, 2, 3, -11 };
var res = array.Where(n => n > 0); // 2, 3
Все стандартные методы реализованы как расширяющие, большинство из них принимает в параметр лямбда-выражение или делегат.
Методы можно применять один за другим:
int[] msv = { -1, 2, 3, -4, 0, 2, 8, 9, 3 };
var res = msv.Where(n => n > 0 && n % 2 == 0).Select(n => n+1).Take(3).Sum(); // 15
Оба вида синтаксиса можно использовать вместе.
Лямбда-выражения
Лямбда-выражения - это специальный синтаксис для сокращённого объявления анонимных методов.
Пример синтаксиса: n => n * n Это выражение принимает один параметр (n) и возвращает n * n.
Пример использования:
int[] msv = { 1, 2, 3 };
var res = msv.Select(n => n * n); // 1, 4, 9
=> - лямбда оператор, который читается как "переходит в".
Слева от лямбда оператора стоят параметры ввода, справа - выражение
Это лямбда-выражение эквивалентно такому: n => { return n * n; } и такому delegate(int n) { return n * n; }
Стандартные операторы запроса используют обобщенные делегаты Func, например Func<int, bool> соответствует лямбда-выражению int => bool, а Func<string, string, int> - (string, string) => int
Возвращаемое значение Func всегда указывается в качестве последнего аргумента.
В лямбда-выражения можно использовать внешние переменные:
int[] msv = { 1, 2, 3 };
int mult = 10;
var res = msv.Select(n => n * mult);
foreach (int i in res) Console.WriteLine(i); // 10, 20, 30
Отложенное выполнение
Большая часть операторов запроса выполняется не при конструировании, а только при переборе элементов.
Пример:
int[] msv = { 1, 2, 3 };
int mult = 2;
var res = msv.Select(n => n * mult); // Здесь запрос еще не выполняется
mult = 20;
foreach (int i in res) Console.WriteLine(i); // Он выполняется здесь
// 20, 40, 60
Это называется отложенным или ленивым выполнением, оно характерно для всех операторов запроса, кроме операторов, возвращающих один элемент (First) или значение (Sum), а также для операторов преобразования типа (ToArray, ToList)
Расширяющие методы
Поскольку все операторы запроса реализованы в виде расширяющих методов, можно легко добавить собственные
Несколько примеров расширяющих методов для LINQ. Метод, обратный методу Where, возвращает последовательность, элементы которой не удовлетворяют предикату
public static IEnumerable<TSource> WhereNot<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicat)
{
foreach (TSource element in source)
{
if (predicat(element) == false)
yield return element;
}
}
//Оператор yield return возвращает один элемент коллекции и перемещает итератор дальше, yield break прекращает итерацию.
// использование метода
int[] msv = { 1, 2, 3, 4, 0 };
var res = msv.WhereNot(n => n > 2); // 1, 2, 0
Метод, возвращающий последовательность от и до определенных индексов
public static IEnumerable<TSource> TakeFromTo<TSource>(this IEnumerable<TSource> source, int from, int to)
{
int iterator = -1;
foreach (TSource element in source)
{
iterator++;
if (iterator >= from && iterator <= to)
yield return element;
}
}
// пример использования
int[] msv = { 1, 2, 3, 4, 5, 6 };
var res = msv.TakeFromTo(1, 4); // 2, 3, 4, 5
Быстрая сортировка
public static IEnumerable<T> QuickSort<T>(this IEnumerable<T> source) where T : IComparable<T>
{
if (!source.Any()) return source;
var first = source.First();
return source.GroupBy(i => i.CompareTo(first)).OrderBy(g => g.Key).SelectMany(g => g.Key == 0 ? g : QuickSort(g)); }
Определение минимального и максимального числа в массиве
// using System.Linq;
int min = a.Min(); int max = a.Max();
Определение суммы чисел в массиве
int sum = a.Sum();
Изменяет порядок элементов последовательности на противоположный
// using System.Linq;
int[] reversedArray = a.Reverse().ToArray();
Возвращает различающиеся элементы последовательности
int[] uniqArray = a.Distinct().ToArray();
Возвращает только те элементы последовательности first, которых нет в последовательности second
int[] arr = first.Where(x => !second.Contains(x)).ToArray();
Находит пересечение множеств, представленных двумя последовательностями
int[] arr = first.Intersect(second).ToArray();
Проецирует матрицу в последовательность
var tmp = new List<int>(matrix.GetLength(0)*matrix.GetLength(1));
foreach (int x in matrix)
tmp.Add(x); int[] arr = tmp.ToArray();
Находит объединение множеств, представленных двумя последовательностями
int[] arr = first.Union(second).ToArray();
SQL
SELECT
SELECT - оператор DML языка SQL, возвращающий набор данных (выборку) из базы данных, удовлетворяющих заданному условию.
вернёт все столбцы всех строк данной таблицы. Для той же таблицы запрос
SELECT * FROM T;
вернёт те же строки, что и первый, однако результат будет отсортирован в обратном порядке (Z-A) из-за использования ключевого слова ORDER BY с полем C1 в качестве поля сортировки
SELECT * FROM T ORDER BY C1 DESC;
DESC – обратный порядок (последний элемент будет 1 в списке)
ASC – сортировать от первого элемента к последнему (1 элемент будет первым в списке)
Отбирает все строки где поле column_name равен одному из перечисленных значений value1,value2,…
SELECT *
FROM TABLE_NAME
WHERE column_name IN (value1,value2,...)
INSERT
Используя перечисление значений, с указанием столбцов:
INSERT INTO <название таблицы> ([<Имя столбца>, ... ]) VALUES (<Значение>,...)
Используя перечисление значений, без указания столбцов:
INSERT INTO <название таблицы> VALUES (<Значение>,...)
Используя select:
INSERT INTO <название таблицы> SELECT <имя столбца>,... FROM <название таблицы>
// В этом случае, в таблицу может вставиться более одной записи. Если в таблице есть
// другие поля требующие заполнения, но не указанные в операторе insert, для них будет
// установлено значение по умолчанию, либо null, если значение по умолчанию не указано.
Пример запроса
INSERT INTO EMPSAMP (NAME, SALARY, DEPTNO, LEVEL) VALUES(’Mary Smith’, 35000.00, 11, ’Associate’)
UPDATE
Пример
UPDATE persons SET street = 'Nissestien 67', city = 'Sandnes' WHERE lastname = 'Tjessem' AND firstname = 'Jakob'
DELETE
Синтаксис
DELETE FROM <Имя Таблицы> WHERE <Условие отбора записей>