Skip to content

Instantly share code, notes, and snippets.

@sampletext32
Last active December 8, 2022 19:59
Show Gist options
  • Save sampletext32/1401b1ed5787273ef3acd88599373678 to your computer and use it in GitHub Desktop.
Save sampletext32/1401b1ed5787273ef3acd88599373678 to your computer and use it in GitHub Desktop.

Оглавление

  1. ADO.NET.
  2. Архитектура SQL Server.
  3. Таблицы в реляционных базах данных.
  4. SQL.
  5. Типы данных в SQL Server
  6. SQL запросы. Создание БД, таблицы.
  7. SQL запросы. CRUD.
  8. Представление в SQL.
  9. Последовательности в SQL.
  10. Этапы проектирования базы данных.
  11. Нормализация. Нормальные формы.
  12. Отношения в реляционных базах данных.
  13. Многие-ко-многим в SQL.
  14. Один-к-одному в SQL.
  15. Соединение в SQL.
  16. Inner Join
  17. Left Outer Join
  18. Right Outer Join
  19. Full Join
  20. Декартово произведение
  21. Cross Join
  22. Подзапросы
  23. Группировка в SQL
  24. Агрегатные функции
  25. Having в SQL
  26. Connected/disconnected модель
  27. Провайдеры данных в ADO.NET
  28. ORM -преимущества и недостатки
  29. SqlClient Data Provider
  30. SqlCommand
  31. SqlDataReader
  32. Инъекция SQL
  33. Параметризированные команды
  34. Entity Framework Core
  35. Database First Model
  36. Класс DbContext
  37. LINQ Query (через методы расширения)
  38. Code First Model
  39. CRUD в EF Core
  40. POCO классы
  41. Миграции
  42. Navigation Properties
  43. Применение Fluent API
  44. Data Annotation
  45. Связи через Data Annotation
  46. Связи через Fluent API
  47. LINQ Query (через SQL синтаксис)
  48. IEnumerable и IQueryable в EF Core
  49. Result Models
  50. Нативные запросы и хранимые процедуры в EF Core
  51. Трекинг объектов, настройка трекинга.
  52. Массовые запросы.
  53. Виды загрузок данных.
  54. Каскадное удаление.
  55. DTO.
  56. AutoMapper. Конфигурация. Плоские объекты.

01. ADO.NET.

ADO.NET - Это стандартная библиотека классов .NET для доступа к базам данных, обработки данных и XML.

  • Поддерживает connected/disconnected модели доступа к данным
  • Отличная интеграция с LINQ
  • Позволяет выполнять SQL в системах СУБД
  • Позволяет получить доступ к данным в стиле ORM

02. Архитектура SQL Server.

image

03. Таблицы в реляционных базах данных.

  • Таблица является фундаментальным блоком любой базы данных
  • Каждая строка называется записью
  • Столбцы (поля) определяют тип данных, которые они содержат.

04. SQL.

  • Язык программирования, предназначенный для управления данными в реляционных базах данных.
  • Разработан в IBM в начале 70-х годов
  • Для связи с Engine мы используем SQL
  • Логически разделен на 4 секции:
    • Определение данных – описание структуры данных
    • Обработка данных – хранение и извлечение данных
    • Управление данными – определяет, кто может получить доступ к данным
    • Управление транзакциями – связывает операции и разрешает откат

05. Типы данных в SQL Server.

image

06. SQL запросы. Создание БД, таблицы.

image

07. SQL запросы. CRUD.

  • CREATE
INSERT INTO users VALUES (login="log", password="pas")
  • READ
SELECT * FROM users WHERE id=1
  • UPDATE
UPDATE users SET pas="123" WHERE id=3
  • DELETE
DELETE FROM users WHERE bdate=current_date()

08. Представление в SQL.

image

09. Последовательности в SQL.

image

10. Этапы проектирования базы данных.

  1. Определение сущностей
  2. Определение столбцов таблицы
  3. Определение первичных ключей для каждой таблицы
  4. Определение отношений и взаимосвязей
  5. Определение других ограничений

11. Нормализация. Нормальные формы.

image

image

12. Отношения в реляционных базах данных.

image

image

image

13. Многие-ко-многим в SQL.

Отношения «многие ко многим» используют таблицу-посредник для сопоставления

image image image

14. Один-к-одному в SQL.

image image image

15. Соединение в SQL.

С помощью оператора JOIN мы можем получить данные из двух таблиц одновременно.

JOINы требуют как минимум две таблицы и условия объединения.

image

16. Inner Join.

image

SELECT * FROM Employees AS e 
INNER JOIN Departments AS d
ON e.DepartmentID = d.DepartmentID

17. Left Outer Join.

image

SELECT * FROM Employees AS e 
LEFT OUTER JOIN Depatments AS d
ON e.DepartmentID = d.DepartmentID

18. Right Outer Join.

image

SELECT * FROM Employees AS e
RIGHT OUTER JOIN Departments AS d
ON e.DepartmentID = d.DepartmentsID

19. Full Join.

image

SELECT * FROM Employees AS e
FULL JOIN Departments AS d
ON e.DepartmentID = d.DepartmentID

20. Декартово произведение.

Декартово произведение двух множеств - множество, элементами которого являются все возможные упорядоченные пары элементов исходных множеств.

image

21. Cross Join.

Cross Join является Декартовым произведением

image

SELECT * FROM Employees AS e
CROSS JOIN Departments AS d

22. Подзапросы.

Подзапросы - SQL запрос внутри большего запроса.

Может быть вложен в

  • SELECT
  • INSERT
  • UPDATE
  • DELETE.

Обычно добавляется в WHERE.

Пример: Вернуть всех сотрудников из отдела бухгалтерии.

SELECT FROM Employees AS e
WHERE e.DepartmentID IN
(
    SELECT d.DepartmentID
	FROM Departments AS d
    WHERE d.Name = ‘Finance’
)

23. Группировка в SQL.

Группировка позволяет «получить» данные в отдельных группах на основе общего атрибута (столбца).

GROUP BY позволяет получить каждую отдельную группу и использовать над ней функцию (например, Average, Min или Max).

Пример: верните сумму заработной платы по отделам.

SELECT e.DepartmentID, SUM(e.Salary) AS TotalSalary
FROM Employees AS e
GROUP BY e.DepartmentID
ORDER BY e.DepartmentID 

24. Агрегатные функции.

Агрегатные функции оперируют непустыми группами для анализа данных результата.

Агрегатные функции всегда игнорируют NULL значения.

  • COUNT - подсчитывает значения в одном или нескольких сгруппированных столбцах. image
  • SUM – суммируют значение в столбцах image
  • MAX – большее значение столбца image
  • MIN – меньшее значение столбца image
  • AVG – среднее значение столбца image

25. Having в SQL.

Определяет условие поиска для группы или статистического выражения.

Предложение HAVING можно использовать только в инструкции SELECT.

HAVING обычно используется с предложением GROUP BY.

Если предложение GROUP BY не используется, используется одна неявная агрегированная группа.

Пример: отфильтруйте отделы, у которых суммарная зарплата больше или равная 15 000. image

26. Connected/disconnected модель.

  • Connected обеспечивает прямой доступ только для чтения к данным в источнике данных и возможность выполнения команд на удаленном источнике данных.

  • Disconnected позволяет управлять данными, полученными из источника данных, а затем согласовывать их с источником данных.

Стоит запомнить:

Извлечение данных в connected model :

  • Открываем соединение (SqlConnection)
  • Выполняем команду (SqlCommand)
  • Обрабатываем результирующий набор данных запроса с помощью объекта чтения (SqlDataReader)
  • Закрываем объект чтения
  • Закрываем соединение

27. Провайдеры данных в ADO.NET.

• Провайдеры данных - это коллекции классов, которые обеспечивают доступ к различным базам данных.

Для различных систем управления реляционными базами данных представлены различные провайдеры данных:

  • Провайдеры данных имеют общие объекты
  • Connection – для подключения к базе данных
  • Command - для выполнения SQL команды
  • DataReader – для извлечения данных

Примеры: (не так важно, но можно запомнить)

Несколько провайдеров данных поставляются как часть .NET Framework

  • SqlClient - доступ к SQL Server
  • OleDB - доступ к стандартным источникам данных OLE DB
  • Odbc - доступ к стандартным источникам данных ODBC
  • Oracle - доступ к базам данных Oracle
  • Сторонние провайдеры данных доступны для:
  • MySQL, PostgreSQL, Interbase, DB2, SQLite
  • Другие системы СУБД и базы данных
  • SQL Azure, Salesforce CRM, Amazon SimpleDB, …

28. ORM - преимущества и недостатки.

Модель доступа к данным в стиле ORM (Entity Framework Core) :

  • Сопоставляет таблицы базы данных с классами и объектами

  • Объекты могут быть автоматически сохранены в базе данных

  • Может работать как в подключенном (connected model) и в отключенном (disconnected model) режимах

  • Преимущества ORM

    • Меньше кода
    • Используем объекты вместо таблиц и SQL
    • Интегрированный объектный механизм запросов
  • Недостатки ORM:

    • Менее гибкое решение
    • SQL генерируется автоматически – вопросы к качеству генерации
    • Проблемы с производительностью (иногда)

29. SqlClient Data Provider.

  • SqlConnection - используется,чтобы установить соединение с бд
  • SqlCommand - выполняет Sql комманды в сервере через соединение
  • SqlDataReader - извлекает данные запроса, по сути есть результат запроса.

30. SqlCommand.

  • Явное открытие и закрытие – методы Open() и Close()
  • Используется конструкция
    using (dbConnection)  
    {
        // выполняем комманды
    }
  • ExecuteScalar() – возвращает первый элемент первого столбца первой строки
  • ExecuteReader() – возвращает SqlDataReader (вопрос выше), а значит извлекает результат запроса
  • ExecuteNonQuery() - возвращает количество затронутых строк(int)

31. SqlDataReader.

  • Извлекает последовательность записей через курсор, возвращенных в результате Sql- команды
    • Данные доступны только для чтения
    • Обработка только вперед
  • Свойства и методы:
    • Read()-перемещает курсор вперед и возвращает false,если следующей записи нет
    • Indexer[]-извлекает значение в текущей строке в таблице по имени столбца или индексу
    • Close() –закрывает курсор и освобождает ресурсы

32. Инъекция SQL.

SQL инъекция — это один из самых доступных способов взлома сайта. Суть таких инъекций – внедрение в данные (передаваемые через GET, POST запросы или значения Cookie) произвольного SQL кода.

Если сайт уязвим и выполняет такие инъекции, то по сути есть возможность творить с БД (чаще всего это MySQL) что угодно.

Примеры:

  • string id = Request["id"];
    $"SELECT * FROM Articles WHERE id={id}"

    При нормальной работе - id - число. Однако

    Можно передать id=1+OR+TRUE, что сломает запрос в вид

    SELECT * FROM Articles WHERE id=1 OR TRUE

    то есть выберет все данные, а не только запрошенные.

  • Или можно написать id=1+;+UPDATE+users+SET+password+=+"+123+"+WHERE+login+=+"+admin+";

    Это сделает запрос

    SELECT * FROM Articles WHERE id=1;UPDATE users SET password="123" WHERE login="admin";

    Что обновит админский пароль и по факту откроет полный доступ к сайту.

Для не допущения этого нужно экранировать переменные, подставляемые в запрос, а лучше использовать параметризованные запросы.

33. Параметризированные команды.

  • Sql запросы и процедуры могут иметь входные и выходные параметры
  • Доступ осуществляется через свойство Parameters класса SQlCommand
  • По сути обычные методы, в которых описывается работа с бд Свойства объекта:
  • ParameterName – имя параметра(название метода)
  • DbType - тип данных(NVarChar…)(параметры в скобочках)
  • Size - размер типа(если можно)
  • Direction – input/output параметры (есть ли выходное значение)

34. Entity Framework Core.

Стандартный ORM фреймворк .NET и .NETCore:

  • Предоставляет возможность использование LINQ(это язык для интегрированных в среду разработки запросов)
  • Автоматическое отслеживает изменения объектов в памяти
  • Работает со многими реляционными базами данных
  • Открытый исходный код с независимым циклом выпуска

35. Database First Model.

Это модель, при которой у нас есть действующая БД и по ней генерируются классы для работы.

Сгенерировать классы можно с помощью Scaffold-DbContext в командной строке.

36. Класс DbContext.

DbContext предоставляет:

  • CRUD операции (Create, Read, Update, Delete)
  • Простой доступ к табличным связям
  • Выполнение LINQ запросов как простых SQL запросов
  • Управление созданием/удалением/миграцией баз данных

Это класс, который описывает вашу Бд в самом коде

  • Как использовать:
    • Создать объект:
      var context = new MyDbContext();
      (Конструктор уже принимает в себя connection string обычно)
  • Свойства класса :
    • Database – обеспечивает создание и удаление
    • ChangeTracker – трекер изменения объектов
    • Все классы таблицы реализуются как свойства тип DbSet
      public DbSet<Student> Students { get; set; }

37. LINQ Query (через методы расширения).

  • LINQ (Language-Integrated Query) представляет простой и удобный язык запросов к источнику данных.
  • В качестве источника данных может выступать объект, реализующий интерфейс IEnumerable (например, стандартные коллекции, массивы), набор данных DataSet, документ XML.
  • Но вне зависимости от типа источника LINQ позволяет применить ко всем один и тот же подход для выборки данных.
  • Методы расширения позволяют "добавлять" методы в существующие типы без создания нового производного типа, перекомпиляции и иного изменения первоначального типа.
  • Методы расширения представляют собой разновидность статического метода, но вызываются так же, как методы экземпляра в расширенном типе.
  • Для клиентского кода, написанного на языках C#, F# и Visual Basic, нет видимого различия между вызовом метода расширения и вызовом методов, определенных в типе.
  • Самые распространенные методы расширения — стандартные операторы запросов LINQ, которые добавляют функции запросов в существующие типы System.Collections.IEnumerable и System.Collections.Generic.IEnumerable.
  • Для использования стандартных операторов запросов их необходимо ввести в область действия с помощью директивы using System.Linq.
  • Тогда каждый тип, реализующий тип IEnumerable, будет иметь методы экземпляра, в частности GroupBy, OrderBy, Average и т. д.
  • Эти дополнительные методы можно видеть в завершении операторов IntelliSense при вводе точки после экземпляра типа IEnumerable, например List или Array.

38. Code First Model.

При использовании подхода Code-First сначала определяется модель в коде, а затем, на ее основе создается (или модифицируется) база данных.

Например:

public class Customer
{
    public int CustomerId { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public int Age { get; set; }
    public byte[] Photo { get; set; }

    // Ссылка на заказы
    public virtual List<Order> Orders { get; set; }
}

public class Order
{
    public int OrderId { get; set; }
    public string ProductName { get; set; }
    public string Description { get; set; }
    public int Quantity { get; set; }
    public DateTime PurchaseDate { get; set; }

    // Ссылка на покупателя
    public Customer Customer { get; set; }
}
  • Этот кусок кода определяет данные заказчика и его покупки.
  • Для каждого заказчика указывается имя, email, возраст и фотография профиля.
  • Идентификатор используется в качестве первичного ключа таблицы Customer.
  • Кроме того, в этом классе есть ссылка на коллекцию покупок.
  • Эта ссылка выражена в виде виртуального свойства и имеет тип обобщенной коллекции List.
  • Класс Order содержит идентификатор заказа, который позволяет уникальным образом распознать каждый заказ в таблице.
  • Кроме того этот класс содержит свойства, описывающие название товара, его количество, описание и дату заказа.
  • Также здесь указана ссылка на покупателя в виде свойства Customer.

39. CRUD в EF Core.

image image image image image image

40. POCO классы.

POCO - Plain Old C# Object

image image

41. Миграции.

image image

42. Navigation Properties.

image

43. Применение Fluent API.

image image image image image image image

44. Data Annotation.

image image image image image image image

45. Связи через Data Annotation.

image image image image image image image image

46. Связи через Fluent API.

image image image

47. LINQ Query (через SQL синтаксис).

IEnumerable<string> query = from word in words
                            where word.Length == 3
                            select word
  • Join
    • Соединяет таблицы с помощью LINQ /методов расширения
      var employees =
          from e in context.Employees
          join d in context.Departments
          on d equals e.Department
          select new
          {
              Employee = e.FirstName,
              JobTitle = e.JobTitle,
              Department = d.Name
          };
  • Группировка
    • С помощью LINQ можно группировать любые коллекции, включая в базах данных создавая запросы:
      var groupedEmployees =
          from employee in context.Employees
          group employee by employee.JobTitle;

48. IEnumerable и IQueryable в EF Core.

image image image image image

49. Result Models.

image image

50. Нативные запросы и хранимые процедуры в EF Core.

image image image image

51. Трекинг объектов, настройка трекинга.

image image image image image image

52. Массовые запросы..

image image image

53. Виды загрузок данных.

image image image image image

54. Каскадное удаление.

image image image

55. DTO.

image image image image image

56. AutoMapper. Конфигурация. Плоские объекты.

image image image image image image image image image image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment