SlideShare uma empresa Scribd logo
1 de 120
Бази данни
Системи за управление на бази данни
ADO.NET
LINQ to SQL
Александър Далемски
musashi.bg@gmail.com

Copyright © 2012 DAVID Holding Company
За какво ще говорим
•
•
•
•
•
•

Релационни бази данни
Проектиране на бази данни
Structured Query Language (SQL)
ADO.NET
Language INtegrated Query (LINQ)
LINQ to SQL

Copyright © 2012 DAVID Holding Company
Бази данни
• Структурирана информация
• Взаимосвързана информация
• Организирана в удобен за софтуерна обработка вид

Copyright © 2012 DAVID Holding Company
Релационни бази данни
• Най-широко разпространени
• Организират информацията във формално дефинирани
таблици

Copyright © 2012 DAVID Holding Company
Таблица (релация)
• Колони (полета, атрибути) – име и дефиниционно
множество (възможни стойности)
• Редове (записи, n-торки)
• Редовете и колоните нямат определена наредба

Copyright © 2012 DAVID Holding Company
Първичен ключ (primary key)
• Една или повече колони
• Определя еднозначно всеки запис
• Препоръчително е всяка таблица да има първичен ключ

Copyright © 2012 DAVID Holding Company
Външен ключ (foreign key)
•
•
•
•

Една или повече колони
Асоциира се с първичния ключ на някоя таблица
Реализира зависимост между записите в двете таблици
Множество записи от вторичната таблица се асоциират
с един запис от първичната таблица

Copyright © 2012 DAVID Holding Company
Индекс (index)
• Оптимизира достъпа до записи по определен критерий
• Осигурява бързодействие за критични за софтуера
манипулации с данните

Copyright © 2012 DAVID Holding Company
Схема на базата данни (schema)
•
•
•
•
•

Описва структурата на данните
Таблици
Колони
Ключове и други ограничения
Индекси

Copyright © 2012 DAVID Holding Company
Системи за управление на бази данни (DBMS)
• Позволяват създаването, поддръжката и употребата на
бази данни
• Силно оптимизирани за ефективност
• Позволяват дефиниране и изпълнение на сложни
действия върху данните и създаване на проекции на
данните
• Някои са предназначени за големи софтуерни системи
(enterprise DBMS), други – за малки приложения
(lightweight DBMS)

Copyright © 2012 DAVID Holding Company
Някои разпространени СУБД
•
•
•
•
•
•
•

Microsoft SQL Server
Oracle
IBM DB2
MySQL
PostgreSQL
Microsoft Access
SQLite

Copyright © 2012 DAVID Holding Company
Проектиране на бази данни
• Модел на предметната област
• Трансформиране на модела в база данни
• Нормализиране на базата данни

Copyright © 2012 DAVID Holding Company
Модел на обектите и зависимостите
(Entity/Relationship Model)
• Типове обекти (entity types)
• Зависимости (relationship sets)
• Атрибути

Copyright © 2012 DAVID Holding Company
Видове зависимости
• Едно-към-едно
• Едно-към-много
• Много-към-много

Copyright © 2012 DAVID Holding Company
Атрибути
• Характеризират множество обекти или зависимост
• Ключови атрибути – участват в еднозначното
определяне на обекти от множеството

Copyright © 2012 DAVID Holding Company
Примерен проект: Здравословно хранене
•
•
•
•
•

Производители
Марки
Продукти
Хранителни факти
Съставки

Copyright © 2012 DAVID Holding Company
E/R модел: Здравословно хранене
Name

Country

Producer

Name
1

producer
of

n

Description

Brand

1
brand of
n
Ingredient

Name

m

contains

n

Product

Energy
value
Proteins

Amount

Fats

Carbohydrates

Copyright © 2012 DAVID Holding Company

Name
Изграждане на базата данни
• Множество обекти -> таблица
• Зависимости едно-към-едно и едно-към-много ->
външни ключове
• Зависимости много-към-много -> свързваща таблица с
външни ключове

Copyright © 2012 DAVID Holding Company
База данни: Здравословно хранене
Producers

Brands

Products

ProducerID

BrandID

ProductID

Name

ProducerID

BrandID

Country

Name

Name

Description

EnergyValue
Proteins
Fats
Carbohydrates

Ingredients

ProductIngredients

IngredientID

ProductID

Name

IngredientID
Amount

Copyright © 2012 DAVID Holding Company
Нормализиране на базата данни
• Премахване на излишни повторения на данни
• Премахване на зависимости между данните
• Избягване на аномалии

Copyright © 2012 DAVID Holding Company
Нормални форми
• Формални критерии за нормалност на таблици
• Всяка следваща нормална форма допълва предишната
с по-строги критерии
• Полезни, но не винаги постижими или оптимални

Copyright © 2012 DAVID Holding Company
Малко дефиниции
• Суперключ - множество от колони в таблица, което
еднозначно определя всеки запис
• Минимален суперключ – суперключ, никое
подмножество на който не е суперключ
• Неключова колона – колона, която не участва в никой
минимален суперключ на таблицата

Copyright © 2012 DAVID Holding Company
Първа нормална форма (1NF)
Няма колона, която може да съдържа множества.

Таблицата не съдържа подтаблици.

Copyright © 2012 DAVID Holding Company
Първа нормална форма (1NF)

Ученик
Георги

фехтовка,
тенис

Иван

баскетбол,
фехтовка

Мария

Copyright © 2012 DAVID Holding Company

Спорт

лека атлетика,
баскетбол,
тенис
Първа нормална форма (1NF)

Ученик
Георги

фехтовка

Георги

тенис

Иван

баскетбол

Иван

фехтовка

Мария

лека атлетика

Мария

баскетбол

Мария

Copyright © 2012 DAVID Holding Company

Спорт

тенис
Втора нормална форма (2NF)
Не съществуват минимален суперключ, за който
стойностите на някоя неключова колона да се определят
еднозначно от негово подмножество.
Всяка неключова колона се определя еднозначно от
целия минимален суперключ.

Copyright © 2012 DAVID Holding Company
Втора нормална форма (2NF)

Ученик

Училище

Спорт

Георги

ПГ „Иван Хаджиенов“

фехтовка

Георги

ПГ „Иван Хаджиенов“

тенис

Иван

СОУ „Антим I“

баскетбол

Иван

СОУ „Антим I“

фехтовка

Мария

ПМГ „Никола Обрешков“

лека атлетика

Мария

ПМГ „Никола Обрешков“

баскетбол

Мария

ПМГ „Никола Обрешков“

тенис

Copyright © 2012 DAVID Holding Company
Втора нормална форма (2NF)

Ученик

Училище

Ученик

Спорт

Георги

ПГ „Иван Хаджиенов“

Георги

фехтовка

Иван

СОУ „Антим I“

Георги

тенис

Мария

ПМГ „Никола Обрешков“

Иван

баскетбол

Иван

фехтовка

Петър

лека атлетика

Петър

баскетбол

Петър

тенис

Copyright © 2012 DAVID Holding Company
Други нормални форми
• 3NF, BCNF, 4NF, 5NF
• Няма да ги разглеждаме в подробности
• За повечето таблици е препоръчителна BCNF

Copyright © 2012 DAVID Holding Company
Structured Query Language (SQL)
•
•
•
•

Специализиран език за програмиране
Управление и работа с данните в СУБД
Дели се на три части: DDL, DCL и DML
Стандартизиран, но всяка СУБД поддържа собствен
диалект
• Microsoft SQL Server използва T-SQL диалекта

Copyright © 2012 DAVID Holding Company
Синтаксис на SQL
•
•
•
•

Декларативен език за програмиране
Съждения
Не се разграничава главни и малки букви
По конвенция ключовите думи се пишат с главни букви

Copyright © 2012 DAVID Holding Company
Идентификатори
• Поредици от букви, долни черти, цифри, която не
започва с цифра
• Поредици от символи, заградени в квадратни скоби
• Поредици от символи, заградени в двойни кавички
test, TEST, TeSt, [test], [TEST], "test", "TEST"

Copyright © 2012 DAVID Holding Company
Запазени и стандартни думи
• Могат да се ползват като идентификатори, когато се
заградят в квадратни скоби или кавички
• Някои от тях могат да се ползват като идентификатори и
без да бъдат заградени, когато не са в подходящия
контекст (но не е препоръчително)

Copyright © 2012 DAVID Holding Company
Променливи
• Незаградени идентификатори с префикс @
• Декларират се с DECLARE
• Обхват - блокът от съждения, в който са дефинирани

Copyright © 2012 DAVID Holding Company
Data Definition Language (DDL)
• Създаване, модификация, изтриване на таблици,
изгледи, съхранени процедури, функции, тригери,
индекси, потребителски типове данни
• Описване и модифициране на схемата на базата данни
• Започват с CREATE, ALTER, DROP или TRUNCATE

Copyright © 2012 DAVID Holding Company
Създаване на таблица
CREATE TABLE [Producers] (
[ProducerID] int
[Name]
nvarchar(100)
[Country]
nvarchar(100)

NOT NULL IDENTITY(1, 1),
NOT NULL,
NULL,

CONSTRAINT [PK_Producers] PRIMARY KEY ([ProducerID])
)
GO

Copyright © 2012 DAVID Holding Company
Създаване на таблица
CREATE TABLE [Brands] (
[BrandID]
int
[ProducerID] int
[Name]
nvarchar(100)

NOT NULL IDENTITY(1, 1),
NOT NULL,
NOT NULL,

CONSTRAINT [PK_Brands] PRIMARY KEY ([BrandID]),
CONSTRAINT [FK_Brands_Producer] FOREIGN KEY ([ProducerID])
REFERENCES [Producers] ([ProducerID]) ON DELETE CASCADE
)
GO

Copyright © 2012 DAVID Holding Company
Модифициране на таблица
ALTER TABLE [Brands] ADD
[Description] nvarchar(MAX)
GO

Copyright © 2012 DAVID Holding Company

NULL
Изтриване на таблица
DROP TABLE [Brands]
GO

Copyright © 2012 DAVID Holding Company
Изпразване съдържанието на таблица
TRUNCATE TABLE [Brands]
GO

Copyright © 2012 DAVID Holding Company
Съхранени процедури
CREATE PROCEDURE [CreateProducer]
@vName nvarchar(100), @vCountry nvarchar(100), @vProducerID int OUTPUT
AS
INSERT INTO [Producers] ([Name], [Country])
VALUES (@vName, @vCountry)
SELECT @vProducerID = SCOPE_IDENTITY()
GO

Copyright © 2012 DAVID Holding Company
Функции
CREATE FUNCTION [GetProducerBrandsCount] (@vProducerID int)
RETURNS int
BEGIN
DECLARE @varCount int
SELECT @varCount = COUNT(*) FROM [Brands]
WHERE ([ProducerID] = @vProducerID)
RETURN @varCount
END

Copyright © 2012 DAVID Holding Company
Изгледи
CREATE VIEW [BrandProducers]
AS
SELECT [B].[BrandID], [B].[Name] AS [BrandName],
[P].[Name] AS [ProducerName]
FROM [Brands] AS [B] INNER JOIN
[Producers] AS [P] ON ([B].[ProducerID] = [P].[ProducerID])
GO

Copyright © 2012 DAVID Holding Company
Индекси
CREATE INDEX [IX_Producers] ON [Producers] (
[Country] ASC, [Name] ASC
)
GO
DROP INDEX [IX_Producers] ON [Producers]
GO

Copyright © 2012 DAVID Holding Company
Data Control Language (DCL)
• Управление на достъпа до обекти в базата данни
• Започват с GRANT, REVOKE или DENY

Copyright © 2012 DAVID Holding Company
Data Control Language (DCL)
GRANT SELECT, INSERT, UPDATE, DELETE ON [Producers]
GO

TO [someone]

DENY INSERT, UPDATE, DELETE
GO

ON [Producers]

TO [someone]

REVOKE DELETE
GO

ON [Producers]

ТО [someone]

Copyright © 2012 DAVID Holding Company
Data Manipulation Language (DML)
• Записване, променяне, изтриване и извличане на данни
• Приложенията, използващи бази данни, използват
предимно DML
• Започват с SELECT, INSERT, UPDATE или DELETE

Copyright © 2012 DAVID Holding Company
SELECT съждения
• Извличат информация от базата данни
• Най-често използваните съждения
• Резултатът обикновено е набор от записи (rowset)
SELECT ...
FROM ...
WHERE ...
GROUP BY ...
HAVING ...
ORDER BY ...

Copyright © 2012 DAVID Holding Company
SELECT и FROM
• SELECT определя колоните, които да участват в резултата
• FROM определя таблицата (или таблиците), от която се

извличат данните
SELECT * FROM [Producers]
SELECT [BrandID], [Name] FROM [Brands]

Copyright © 2012 DAVID Holding Company
Филтриране
• WHERE посочва критерий (или критерии), по който да се

отсеят записите в резултата
• =, <>, <, <=, >, >=
• EXISTS, IS NULL, LIKE, IN
• NOT, OR, AND
SELECT * FROM [Products]
WHERE ([ProductID] > 10)
SELECT * FROM [Products]
WHERE ([BrandID] = 2)
SELECT * FROM [Brands]
WHERE ([Name] IN (N'Coca-Cola', N'Fanta', N'Sprite', N'Schweppes'))
AND ([Description] IS NOT NULL)

Copyright © 2012 DAVID Holding Company
Влагане на заявки
• Често се налага влагане на заявки – например в SELECT
или WHERE клаузите
SELECT * FROM [Brands]
WHERE ([BrandID] NOT IN (SELECT DISTINCT [BrandID] FROM [Products]))

Copyright © 2012 DAVID Holding Company
Сортиране
• ORDER BY посочва колона или редица от колони, по

които да се подредят записите в резултата
SELECT * FROM [Brands]
ORDER BY [Name]
SELECT * FROM [Products]
ORDER BY [EnergyValue] DESC, [Name] ASC

Copyright © 2012 DAVID Holding Company
Агрегиране
• Получаване на единична стойност от стойностите на
всички записи за дадена колона
• COUNT, SUM, MAX, MIN, AVG
SELECT COUNT([Description]) FROM [Brands]
SELECT COUNT(*) FROM [Products]
WHERE ([BrandID] = 4)
SELECT COUNT(DISTINCT [BrandID]) FROM [Products]

Copyright © 2012 DAVID Holding Company
Групиране
• Позволява прилагането на агрегатни функции върху
част от записите в таблица
• GROUP BY указва всички колони, по които трябва да се
групират записите
• HAVING указва допълнителен критерий, по който да се
отсеят групираните резултати
SELECT [BrandID], AVG([EnergyValue]) FROM [Products]
GROUP BY [BrandID]
SELECT [BrandID], COUNT(*) FROM [Products]
GROUP BY [BrandID]
HAVING (COUNT(*) > 1)

Copyright © 2012 DAVID Holding Company
Съединения
• Служат за комбиниране на записи от няколко таблици
• Прилагат се JOIN оператори във FROM клаузата
• Могат да се свързват повече от две таблици с
последователно прилагане на JOIN оператори

Copyright © 2012 DAVID Holding Company
INNER JOIN
• Комбинира всеки запис от едната таблица с един или
повече записи от другата таблица по зададен критерий
• Премахва записите, които не могат да се свържат с
никой запис от другата таблица
SELECT [P].[ProductID], [B].[Name] AS [BrandName],
[P].[Name] AS [ProductName]
FROM [Products] AS [P] INNER JOIN
[Brands] AS [B] ON ([P].[BrandID] = [B].[BrandID])

Copyright © 2012 DAVID Holding Company
OUTER JOIN
• Комбинира всеки запис от едната таблица с един или
повече записи от другата таблица по зададен критерий
• Не премахва записите от първата таблица, които не
могат да се свържат с нито един запис от втората
SELECT [P].[Name] AS [ProducerName], COUNT([B].[BrandID]) AS [BrandCount]
FROM [Producers] AS [P] LEFT OUTER JOIN
[Brands] AS [B] ON ([P].[ProducerID] = [B].[ProducerID])
GROUP BY [P].[Name]

Copyright © 2012 DAVID Holding Company
INSERT съждения
• Създават нови записи в таблица
• Могат да се комбинират със SELECT съждения за
автоматично генериране на данните в новите записи
INSERT INTO ... (...) VALUES (...)
INSERT INTO ... (...) SELECT ...

INSERT INTO [Brands] ([ProducerID], [Name])
VALUES (5, 'Lindt')
INSERT INTO [Products] ([BrandID], [Name], [EnergyValue])
SELECT 9, [Name], [Energy]
FROM [LegacyProducts]
WHERE ([Brand] = N'Lindt')

Copyright © 2012 DAVID Holding Company
UPDATE съждения
• Променят съдържанието на съществуващи записи
• По подразбиране променят всички записи в таблицата
UPDATE ...
SET ...
WHERE ...

UPDATE [Brands] SET [Description] = N'Швейцарско качество!'
WHERE ([Name] = N'Lindt')
UPDATE [Products] SET [EnergyValue] = [EnergyValue]*4.184

Copyright © 2012 DAVID Holding Company
DELETE съждения
• Изтриват записи от таблица
• По подразбиране изтриват всички записи от таблицата
DELETE FROM ...
WHERE ...

DELETE FROM [Products]
WHERE ([EnergyValue] < 0)

Copyright © 2012 DAVID Holding Company
Трансакции
• Поредици от операции
• Изпълняват се цялостно и независимо от всички
останали трансакции
• Гарантиране консистентността на данните

Copyright © 2012 DAVID Holding Company
Характеристики на трансакциите
•
•
•
•

Атомарност
Консистентност
Изолираност
Устойчивост

Copyright © 2012 DAVID Holding Company
Трансакции в SQL
BEGIN TRANSACTION
COMMIT TRANSACTION
ROLLBACK TRANSACTION

Copyright © 2012 DAVID Holding Company
ADO.NET
•
•
•
•

Част от .NET Framework
Наследник на ActiveX Data Objects (ADO)
Удобни начини за достъп до бази данни
Минимална зависимост от избора на СУБД

Copyright © 2012 DAVID Holding Company
ADO.NET доставчици (data providers)
•
•
•
•
•

Data Provider for SQL Server
Data Provider for OLE DB
Data Provider for ODBC
Data Provider for Oracle
Data Provider for SQL Server Compact 4.0

Copyright © 2012 DAVID Holding Company
Модели за достъп до данните в ADO.NET
•
•
•
•

Свързан модел
Несвързан модел
LINQ to SQL
Entity Framework

Copyright © 2012 DAVID Holding Company
Connection strings
• Служат за осъществяване на връзката с базата данни
• Представляват поредица от двойки
„параметър=стойност“, разделени с ;
• Различните доставчици поддържат различни параметри
Server=(local); Database=HealthyFood; Integrated Security=SSPI
Server=(local); Database=HealthyFood; Integrated Security=False; User ID=sa;
Password=$secret$; Persist Security Info=False

Copyright © 2012 DAVID Holding Company
Основни параметри на connection string
•
•
•
•
•
•

Server
Database
Integrated Security
User ID
Password
Persist Security Info

Copyright © 2012 DAVID Holding Company
Автоматично генериране на
connection string
• Използва се SqlConnectionStringBuilder
• Параметрите на връзката са свойства на обекта

Copyright © 2012 DAVID Holding Company
Съхраняване на connection string в
конфигурационен файл
• Позволява промяна без прекомпилиране на
приложението
• Записва се в секцията <connectionStrings>
• Достъпва се през
ConfigurationManager.ConnectionStrings
<configuration>
<connectionStrings>
<add name="connection"
providerName="System.Data.SqlClient"
connectionString="Server=(local); Database=HealthyFood; Integrated
Security=SSPI" />
</connectionStrings>
</configuration>

connection.ConnectionString = ConfigurationManager
.ConnectionStrings["connection"].ConnectionString;

Copyright © 2012 DAVID Holding Company
SqlConnection
• Осъществява връзката с базата данни
• Получава connection string
• Open()
• IDisposable
using (var connection = new SqlConnection())
{
connection.ConnectionString = ConfigurationManager
.ConnectionStrings["connection"].ConnectionString;
connection.Open();
// операции върху базата...
}

Copyright © 2012 DAVID Holding Company
SqlCommand
• Служи за изпълнение на заявки
• Получава отворен SqlConnection
• ExecuteNonQuery(), ExecuteScalar(), ExecuteReader()
• IDisposable
using (SqlCommand command = connection.CreateCommand())
{
command.CommandText = "SELECT COUNT(*) FROM [Producers]";
int producerCount = (int)command.ExecuteScalar();
Console.WriteLine("Producers count: {0}", producerCount);
}

Copyright © 2012 DAVID Holding Company
SqlCommand - ExecuteReader
using (SqlCommand command = connection.CreateCommand())
{
command.CommandText = "SELECT [ProducerID], [Name] FROM [Producers]";
using (DbDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine("ProducerID: {0}; Name: {1}",
reader["ProducerID"], reader["Name"]);
}
}
}

Copyright © 2012 DAVID Holding Company
SqlCommand - параметри
• Служат за динамично предаване на стойности
• Име, тип и стойност
• SqlCommand.Parameters
Console.Write("Input producer ID: ");
int producerID = Convert.ToInt32(Console.ReadLine());
using (SqlCommand command = connection.CreateCommand())
{
command.CommandText =
@"SELECT [BrandID], [Name] FROM [Brands]
WHERE ([ProducerID] = @producer_id)";
command.Parameters.AddWithValue("@producer_id", producerID);
using (DbDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine("BrandID: {0}; Name: {1}",
reader["BrandID"], reader["Name"]);
}
}
}
Copyright © 2012 DAVID Holding Company
SQL injection атаки
• Пробив в сигурността на базата данни
• Динамично генериране на заявки с конкатениране на
низове
Console.WriteLine("Input brand name to search for: ");
string name = Console.ReadLine();
using (SqlCommand command = connection.CreateCommand())
{
command.CommandText =
@"SELECT [BrandID], [Name] FROM [Brands]
WHERE ([Name] = N'" + name + "')";
using (DbDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine("BrandID: {0}; Name: {1}",
reader["BrandID"], reader["Name"]);
}
}
}
Copyright © 2012 DAVID Holding Company
SQL injection атаки
'); DELETE FROM [Products];-SELECT [ProductID], [Name] FROM [Products]
WHERE ([Name] = N''); DELETE FROM [Products];--')

Copyright © 2012 DAVID Holding Company
SQL injection атаки
Правилна имплементация – използване на параметри
Console.WriteLine("Input brand name to search for: ");
string name = Console.ReadLine();
using (SqlCommand command = connection.CreateCommand())
{
command.CommandText =
@"SELECT [BrandID], [Name] FROM [Brands]
WHERE ([Name] = @name)";
command.Parameters.AddWithValue("@name", name);
using (DbDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine("BrandID: {0}; Name: {1}",
reader["BrandID"], reader["Name"]);
}
}
}

Copyright © 2012 DAVID Holding Company
SqlCommand – съхранени процедури
• CommandType.StoredProcedure
• Parameters
using (SqlCommand command = connection.CreateCommand())
{
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "[CreateProduct]";
command.Parameters.AddWithValue("@vBrandID", 5);
command.Parameters.AddWithValue("@vName", "Шоколад Milka алпийско мляко");
command.Parameters.AddWithValue("@vEnergyValue", (decimal)532);
command.Parameters.AddWithValue("@vProteins", (decimal)6.8);
command.Parameters.AddWithValue("@vFats", (decimal)29.6);
command.Parameters.AddWithValue("@vCarbohydrates", (decimal)58);
command.Parameters.Add("@vProductID", SqlDbType.Int).Direction = ParameterDirection.Output;
command.ExecuteNonQuery();
Console.WriteLine("Created product ID: {0}",
(int)command.Parameters["@vProductID"].Value);
}

Copyright © 2012 DAVID Holding Company
Трансакции в ADO.NET
• TransactionScope
• Complete()
• IDisposable
using (var ts = new TransactionScope())
using (var connection = new SqlConnection())
{
connection.ConnectionString = ConfigurationManager
.ConnectionStrings["connection"].ConnectionString;
connection.Open();
// операции в трансакция
ts.Complete();
}

Copyright © 2012 DAVID Holding Company
Императивни езици за програмиране
• C, C++, C#, Java, Pascal, Visual Basic,…
• Поредици от инструкции (съждения)
• Близки до машинния език

Copyright © 2012 DAVID Holding Company
Функционални езици за програмиране
•
•
•
•

Scheme, Haskell, F#, Scala,…
Композиране на функции
Изрази
Близки до математиката

Copyright © 2012 DAVID Holding Company
Умножение с константа
Императивна версия:
function MulBy2(x)
{
return x*2;
}

Copyright © 2012 DAVID Holding Company
Умножение с константа
Фунцкионална версия:
function MulBy2(x) = x*2;

Copyright © 2012 DAVID Holding Company
Умножение на всички елементи на списък
с константа
Императивна версия:
function MulElementsBy2(list)
{
result = EmptyList();
foreach (x in list)
{
AddElement(x*2, result);
}
return result;
}

Copyright © 2012 DAVID Holding Company
Умножение на всички елементи на списък
с константа
Функционална версия:
function MulElementsBy2(list) = Map(MulBy2, list);

Copyright © 2012 DAVID Holding Company
Отсяване на елементи от списък
Императивна версия:
function GetPositiveElements(list)
{
result = EmptyList();
foreach (x in list)
{
if (x > 0)
{
AddElement(x, result);
}
}
return result;
}

Copyright © 2012 DAVID Holding Company
Отсяване на елементи от списък
Функционална версия:
function IsPositive(x) = x > 0;
function GetPositiveElements(list) = Filter(IsPositive, list);

Copyright © 2012 DAVID Holding Company
Намиране сумата на елементите на списък
Императивна версия:
function Sum(list)
{
result = 0;
foreach (x in list)
{
result += x;
}
return result;
}

Copyright © 2012 DAVID Holding Company
Намиране сумата на елементите на списък
Функционална версия:
function Add(x, y) = x + y;
function Sum(list) = Fold(Add, 0, list);

Copyright © 2012 DAVID Holding Company
Намиране средно аритметично на
елементите на списък
Императивна версия:
function Average(list)
{
sum = 0;
count = 0;
foreach (x in list)
{
sum += x;
count++;
}
return sum/count;
}

Copyright © 2012 DAVID Holding Company
Намиране средно аритметично на
елементите на списък
Функционална версия:
function Add1(x, y) = x + 1;
function Count(list) = Fold(Add1, 0, list);
function Average(list) = Sum(list)/Count(list);

Copyright © 2012 DAVID Holding Company
Разширителни методи на IEnumerable<T>
• Въведени в .NET Framework 3.5
• Улесняват прилагането на често използвани операции
върху колекции
• Следват функционалната парадигма
• System.Linq.Enumerable

Copyright © 2012 DAVID Holding Company
Разширителни методи на IEnumerable<T>
IEnumerable<U> Select<T, U>(this IEnumerable<T> source, Func<T, U> selector)
IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> predicate)
U Aggregate<T, U>(this IEnumerable<T> source, U seed, Func<U, T, U> function)
IEnumerable<T> Skip<T>(this IEnumerable<T> source, int count)
IEnumerable<T> Take<T>(this IEnumerable<T> source, int count)

Copyright © 2012 DAVID Holding Company
Разширителни методи на IEnumerable<T> отложено изпълнение
var numbers = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
IEnumerable<int> newNumbers = numbers
.Where(x => x % 2 == 0)
.Select(x => x*2);
// в този момент newNumbers съхранява информация за операциите,
// които трябва да се извършат
numbers.Add(10);
// точно преди началото на обхождането на newNumbers с foreach,
// операциите се изпълняват и резултатът се подава на цикъла
foreach (int n in newNumbers)
{
Console.WriteLine(n);
}

Copyright © 2012 DAVID Holding Company
Разширителни методи на IEnumerable<T>
• First, Last, FirstOrDefault, LastOrDefault
• Sum, Min, Max, Average, Count
• ToList, ToArray, ToDictionary

Copyright © 2012 DAVID Holding Company
Разширителни методи на IEnumerable<T> сортировка
IOrderedEnumerable<T> OrderBy<T, U>(this IEnumerable<T> source,
Func<T, U> keySelector)
IOrderedEnumerable<T> OrderByDescending<T, U>(
this IEnumerable<T> source,
Func<T, U> keySelector)
IOrderedEnumerable<T> ThenBy<T, U>(this IOrderedEnumerable<T> source,
Func<T, U> keySelector)
IOrderedEnumerable<T> ThenByDescending<T, U>(
this IOrderedEnumerable<T> source,
Func<T, U> keySelector)

Copyright © 2012 DAVID Holding Company
Разширителни методи на IEnumerable<T> групиране
IEnumerable<IGrouping<U, T>> GroupBy<T, U>(this IEnumerable<T> source,
Func<T, U> keySelector)

Copyright © 2012 DAVID Holding Company
Разширителни методи на IEnumerable<T> съединения
IEnumerable<W> Join<T, U, V, W>(this IEnumerable<T> first,
IEnumerable<U> second,
Func<T, V> firstKeySelector,
Func<U, V> secondKeySelector,
Func<T, U, W> resultSelector)
IEnumerable<W> GroupJoin<T, U, V, W>(
this IEnumerable<T> first,
IEnumerable<U> second,
Func<T, V> firstKeySelector,
Func<U, V> secondKeySelector,
Func<T, IEnumerable<U>, W> resultSelector)

Copyright © 2012 DAVID Holding Company
Language INtegrated Query (LINQ)
• Също въведен в .NET Framework 3.5
• Синтаксис подобен на SQL
• Трансформира се в извиквания на разширителните
методи на IEnumerable<T> и IQueryable<T>
• Няколко различни имплементации

Copyright © 2012 DAVID Holding Company
LINQ - примери
var example1 = from n in numbers
select n*2;
var example1 = numbers.Select(n => n*2);

Copyright © 2012 DAVID Holding Company
LINQ - примери
var example2 = from n in numbers
where n > 15
orderby n % 4, n % 7 descending
select n;
var example2 = numbers
.Where(n => n > 15)
.OrderBy(n => n % 4)
.ThenByDescending(n => n % 7);

Copyright © 2012 DAVID Holding Company
LINQ - примери
var example3 = from n in numbers
group n by n % 3 into ng
where ng.Count() == 2
select ng;
var example3 = numbers
.GroupBy(n => n % 3)
.Where(ng => ng.Count() == 2);

Copyright © 2012 DAVID Holding Company
LINQ - примери
var example4 = from n in numbers
join m in numbers on n % 3 equals m % 3
select Tuple.Create(n, m);

var example4 = numbers
.Join(numbers, n => n % 3, m => m % 3, (n, m) => Tuple.Create(n, m));

Copyright © 2012 DAVID Holding Company
IQueryable<T>
• Наследява IEnumerable<T>
• Различна имплементация на повечето разширителни
методи на IEnumerable<T>
• Служи за трансформиране на LINQ заявки към SQL,
XPath и др.
• System.Linq.Queryable

Copyright © 2012 DAVID Holding Company
Имплементации на LINQ
•
•
•
•
•

LINQ to Objects
LINQ to XML
LINQ to Dataset
LINQ to SQL
LINQ to Entities

Copyright © 2012 DAVID Holding Company
LINQ to SQL
• Част от ADO.NET
• Въведен в .NET Framework 3.5
• Object-Relational Mapping (ORM) – ръчно дефиниране
или описване с DBML
• Само с Data Provider for SQL Server
• System.Data.Linq

Copyright © 2012 DAVID Holding Company
Ръчно описване на ORM модела
• Прави се с атрибути
• System.Data.Linq.Mapping

Copyright © 2012 DAVID Holding Company
Ръчно описване на ORM модела - таблици
• Table
• Column
[Table(Name = "Producers")]
public class Producer
{
[Column(IsPrimaryKey = true)]
public int ProducerID { get; set; }

[Column(CanBeNull = false)]
public string Name { get; set; }
[Column]
public string Country { get; set; }
}

Copyright © 2012 DAVID Holding Company
Ръчно описване на ORM модела - връзки
• Association
• EntitySet<T>, EntityRef<T>
[Table(Name = "Producers")]
public class Producer
{
private EntitySet<Brand> _brands;
[Column(IsPrimaryKey = true)]
public int ProducerID { get; set; }

[Column(CanBeNull = false)]
public string Name { get; set; }
[Column]
public string Country { get; set; }
[Association(Storage = "_brands", OtherKey = "ProducerID")]
public EntitySet<Brand> Brands
{
get { return _brands; }
set { _brands.Assign(value); }
}
}
Copyright © 2012 DAVID Holding Company
Ръчно описване на ORM модела - връзки
[Table(Name = "Brands")]
public class Brand
{
private EntityRef<Producer> _producer;

[Column(IsPrimaryKey = true)]
public int BrandID { get; set; }
[Column]
public int ProducerID { get; set; }
[Column(CanBeNull = false)]
public string Name { get; set; }
[Column]
public string Description { get; set; }
[Association(Storage = "_producer", ThisKey = "ProducerID")]
public Producer Producer
{
get { return _producer.Entity; }
set { _producer.Entity = value; }
}
}

Copyright © 2012 DAVID Holding Company
Ръчно описване на ORM модела - контекст
• DataContext
public class HealthyFoodContext : DataContext
{
public HealthyFoodContext(string connectionString)
: base(connectionString) { }
public Table<Producer> Producers
{
get { return GetTable<Producer>(); }
}
public Table<Brand> Brands
{
get { return GetTable<Brand>(); }
}
}
string connectionString =
ConfigurationManager.ConnectionStrings["connection"].ConnectionString;
var context = new HealthyFoodContext(connectionString);

Copyright © 2012 DAVID Holding Company
LINQ to SQL заявки - примери
IEnumerable<Brand> brands = from b in context.Brands
select b;
IEnumerable<Brand> brands = from b in context.Brands
where b.BrandID > 3
select b;
var brands = from b in context.Brands
select new { BrandID = b.BrandID, BrandName = b.Name };
var brands = from b in context.Brands
select new { ProducerName = b.Producer.Name,
BrandName = b.Name };
IEnumerable<Brand> brands = context.Producers
.Where(p => p.Name != "Kraft Foods")
.SelectMany(p => p.Brands);
Producer producer = context.Producers.Single(p => p.ProducerID == 3);

Copyright © 2012 DAVID Holding Company
Описване на ORM модела с DBML
• Специализиран XML документ
• LINQ to SQL Classes файлов шаблон
• Автоматично генериране на C# код
• partial класове - добавяне на методи/свойства във
външни файлове

Copyright © 2012 DAVID Holding Company
ORM модел: Здравословно хранене

Copyright © 2012 DAVID Holding Company
LINQ to SQL – добавяне на записи
Brand brand = context.Brands.Single(b => b.BrandID == 5);
var product = new Product
{
Name = "Шоколад Milka алпийско мляко",
EnergyValue = 532,
};
brand.Products.Add(product);

Copyright © 2012 DAVID Holding Company
LINQ to SQL – редактиране на записи
Product product = context.Products.Single(p => p.ProductID == 19);
product.Proteins = (decimal)6.8;
product.Fats = (decimal)29.6;
product.Carbohydrates = (decimal)58;

Copyright © 2012 DAVID Holding Company
LINQ to SQL – изтриване на записи
Product product = context.Products.Single(p => p.ProductID == 19);
context.Products.DeleteOnSubmit(product);

Copyright © 2012 DAVID Holding Company
LINQ to SQL – записване на промените
context.SubmitChanges();

Copyright © 2012 DAVID Holding Company
Полезни връзки
• T-SQL - http://msdn.microsoft.com/enus/library/ms189826%28v=SQL.90%29.aspx
• ADO.NET - http://msdn.microsoft.com/enus/library/e80y5yhx%28v=vs.100%29.aspx
• LINQ to SQL - http://msdn.microsoft.com/enus/library/bb386976%28v=vs.100%29.aspx

Copyright © 2012 DAVID Holding Company
Благодаря за вниманието!
• Въпроси?
• musashi.bg@gmail.com

Copyright © 2012 DAVID Holding Company

Mais conteúdo relacionado

Mais de DAVID Academy

Курс по уеб програмиране (2015), занятие №2 - CSS
Курс по уеб програмиране (2015), занятие №2 - CSSКурс по уеб програмиране (2015), занятие №2 - CSS
Курс по уеб програмиране (2015), занятие №2 - CSSDAVID Academy
 
Курс по уеб програмиране (2015), занятие №1 - HTML
Курс по уеб програмиране (2015), занятие №1 - HTMLКурс по уеб програмиране (2015), занятие №1 - HTML
Курс по уеб програмиране (2015), занятие №1 - HTMLDAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №14
Училищен курс по програмиране на C# (2013/2014), занятие №14Училищен курс по програмиране на C# (2013/2014), занятие №14
Училищен курс по програмиране на C# (2013/2014), занятие №14DAVID Academy
 
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)DAVID Academy
 
Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)
Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)
Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)DAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №13
Училищен курс по програмиране на C# (2013/2014), занятие №13Училищен курс по програмиране на C# (2013/2014), занятие №13
Училищен курс по програмиране на C# (2013/2014), занятие №13DAVID Academy
 
Курс по уеб програмиране (2014), занятие №2 - CSS
Курс по уеб програмиране (2014), занятие №2 - CSSКурс по уеб програмиране (2014), занятие №2 - CSS
Курс по уеб програмиране (2014), занятие №2 - CSSDAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №12
Училищен курс по програмиране на C# (2013/2014), занятие №12Училищен курс по програмиране на C# (2013/2014), занятие №12
Училищен курс по програмиране на C# (2013/2014), занятие №12DAVID Academy
 
Курс по уеб програмиране (2014), занятие №1 - HTML
Курс по уеб програмиране (2014), занятие №1 - HTMLКурс по уеб програмиране (2014), занятие №1 - HTML
Курс по уеб програмиране (2014), занятие №1 - HTMLDAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №11
Училищен курс по програмиране на C# (2013/2014), занятие №11Училищен курс по програмиране на C# (2013/2014), занятие №11
Училищен курс по програмиране на C# (2013/2014), занятие №11DAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №10
Училищен курс по програмиране на C# (2013/2014), занятие №10Училищен курс по програмиране на C# (2013/2014), занятие №10
Училищен курс по програмиране на C# (2013/2014), занятие №10DAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №9
Училищен курс по програмиране на C# (2013/2014), занятие №9Училищен курс по програмиране на C# (2013/2014), занятие №9
Училищен курс по програмиране на C# (2013/2014), занятие №9DAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №8
Училищен курс по програмиране на C# (2013/2014), занятие №8Училищен курс по програмиране на C# (2013/2014), занятие №8
Училищен курс по програмиране на C# (2013/2014), занятие №8DAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №7
Училищен курс по програмиране на C# (2013/2014), занятие №7Училищен курс по програмиране на C# (2013/2014), занятие №7
Училищен курс по програмиране на C# (2013/2014), занятие №7DAVID Academy
 
Училищен курс по програмиране на C# (2013/2014) - Помагало
Училищен курс по програмиране на C# (2013/2014) - ПомагалоУчилищен курс по програмиране на C# (2013/2014) - Помагало
Училищен курс по програмиране на C# (2013/2014) - ПомагалоDAVID Academy
 
Училищен курс по програмиране на C# (2013/2014) - Упражнения
Училищен курс по програмиране на C# (2013/2014) - УпражненияУчилищен курс по програмиране на C# (2013/2014) - Упражнения
Училищен курс по програмиране на C# (2013/2014) - УпражненияDAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №4
Училищен курс по програмиране на C# (2013/2014), занятие №4Училищен курс по програмиране на C# (2013/2014), занятие №4
Училищен курс по програмиране на C# (2013/2014), занятие №4DAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №3
Училищен курс по програмиране на C# (2013/2014), занятие №3Училищен курс по програмиране на C# (2013/2014), занятие №3
Училищен курс по програмиране на C# (2013/2014), занятие №3DAVID Academy
 
Курс по информационни технологии (2013) - 5. HTTP & Web Services
Курс по информационни технологии (2013) - 5. HTTP & Web ServicesКурс по информационни технологии (2013) - 5. HTTP & Web Services
Курс по информационни технологии (2013) - 5. HTTP & Web ServicesDAVID Academy
 
Курс по информационни технологии (2013) - 4. XML, XSD, XML в .NET Framework
Курс по информационни технологии (2013) - 4. XML, XSD, XML в .NET FrameworkКурс по информационни технологии (2013) - 4. XML, XSD, XML в .NET Framework
Курс по информационни технологии (2013) - 4. XML, XSD, XML в .NET FrameworkDAVID Academy
 

Mais de DAVID Academy (20)

Курс по уеб програмиране (2015), занятие №2 - CSS
Курс по уеб програмиране (2015), занятие №2 - CSSКурс по уеб програмиране (2015), занятие №2 - CSS
Курс по уеб програмиране (2015), занятие №2 - CSS
 
Курс по уеб програмиране (2015), занятие №1 - HTML
Курс по уеб програмиране (2015), занятие №1 - HTMLКурс по уеб програмиране (2015), занятие №1 - HTML
Курс по уеб програмиране (2015), занятие №1 - HTML
 
Училищен курс по програмиране на C# (2013/2014), занятие №14
Училищен курс по програмиране на C# (2013/2014), занятие №14Училищен курс по програмиране на C# (2013/2014), занятие №14
Училищен курс по програмиране на C# (2013/2014), занятие №14
 
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)
 
Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)
Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)
Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)
 
Училищен курс по програмиране на C# (2013/2014), занятие №13
Училищен курс по програмиране на C# (2013/2014), занятие №13Училищен курс по програмиране на C# (2013/2014), занятие №13
Училищен курс по програмиране на C# (2013/2014), занятие №13
 
Курс по уеб програмиране (2014), занятие №2 - CSS
Курс по уеб програмиране (2014), занятие №2 - CSSКурс по уеб програмиране (2014), занятие №2 - CSS
Курс по уеб програмиране (2014), занятие №2 - CSS
 
Училищен курс по програмиране на C# (2013/2014), занятие №12
Училищен курс по програмиране на C# (2013/2014), занятие №12Училищен курс по програмиране на C# (2013/2014), занятие №12
Училищен курс по програмиране на C# (2013/2014), занятие №12
 
Курс по уеб програмиране (2014), занятие №1 - HTML
Курс по уеб програмиране (2014), занятие №1 - HTMLКурс по уеб програмиране (2014), занятие №1 - HTML
Курс по уеб програмиране (2014), занятие №1 - HTML
 
Училищен курс по програмиране на C# (2013/2014), занятие №11
Училищен курс по програмиране на C# (2013/2014), занятие №11Училищен курс по програмиране на C# (2013/2014), занятие №11
Училищен курс по програмиране на C# (2013/2014), занятие №11
 
Училищен курс по програмиране на C# (2013/2014), занятие №10
Училищен курс по програмиране на C# (2013/2014), занятие №10Училищен курс по програмиране на C# (2013/2014), занятие №10
Училищен курс по програмиране на C# (2013/2014), занятие №10
 
Училищен курс по програмиране на C# (2013/2014), занятие №9
Училищен курс по програмиране на C# (2013/2014), занятие №9Училищен курс по програмиране на C# (2013/2014), занятие №9
Училищен курс по програмиране на C# (2013/2014), занятие №9
 
Училищен курс по програмиране на C# (2013/2014), занятие №8
Училищен курс по програмиране на C# (2013/2014), занятие №8Училищен курс по програмиране на C# (2013/2014), занятие №8
Училищен курс по програмиране на C# (2013/2014), занятие №8
 
Училищен курс по програмиране на C# (2013/2014), занятие №7
Училищен курс по програмиране на C# (2013/2014), занятие №7Училищен курс по програмиране на C# (2013/2014), занятие №7
Училищен курс по програмиране на C# (2013/2014), занятие №7
 
Училищен курс по програмиране на C# (2013/2014) - Помагало
Училищен курс по програмиране на C# (2013/2014) - ПомагалоУчилищен курс по програмиране на C# (2013/2014) - Помагало
Училищен курс по програмиране на C# (2013/2014) - Помагало
 
Училищен курс по програмиране на C# (2013/2014) - Упражнения
Училищен курс по програмиране на C# (2013/2014) - УпражненияУчилищен курс по програмиране на C# (2013/2014) - Упражнения
Училищен курс по програмиране на C# (2013/2014) - Упражнения
 
Училищен курс по програмиране на C# (2013/2014), занятие №4
Училищен курс по програмиране на C# (2013/2014), занятие №4Училищен курс по програмиране на C# (2013/2014), занятие №4
Училищен курс по програмиране на C# (2013/2014), занятие №4
 
Училищен курс по програмиране на C# (2013/2014), занятие №3
Училищен курс по програмиране на C# (2013/2014), занятие №3Училищен курс по програмиране на C# (2013/2014), занятие №3
Училищен курс по програмиране на C# (2013/2014), занятие №3
 
Курс по информационни технологии (2013) - 5. HTTP & Web Services
Курс по информационни технологии (2013) - 5. HTTP & Web ServicesКурс по информационни технологии (2013) - 5. HTTP & Web Services
Курс по информационни технологии (2013) - 5. HTTP & Web Services
 
Курс по информационни технологии (2013) - 4. XML, XSD, XML в .NET Framework
Курс по информационни технологии (2013) - 4. XML, XSD, XML в .NET FrameworkКурс по информационни технологии (2013) - 4. XML, XSD, XML в .NET Framework
Курс по информационни технологии (2013) - 4. XML, XSD, XML в .NET Framework
 

Курс по програмиране за напреднали (2012) - 3. Бази данни. Системи за управление на бази данни. ADO.NET. LINQ to SQL

  • 1. Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL Александър Далемски musashi.bg@gmail.com Copyright © 2012 DAVID Holding Company
  • 2. За какво ще говорим • • • • • • Релационни бази данни Проектиране на бази данни Structured Query Language (SQL) ADO.NET Language INtegrated Query (LINQ) LINQ to SQL Copyright © 2012 DAVID Holding Company
  • 3. Бази данни • Структурирана информация • Взаимосвързана информация • Организирана в удобен за софтуерна обработка вид Copyright © 2012 DAVID Holding Company
  • 4. Релационни бази данни • Най-широко разпространени • Организират информацията във формално дефинирани таблици Copyright © 2012 DAVID Holding Company
  • 5. Таблица (релация) • Колони (полета, атрибути) – име и дефиниционно множество (възможни стойности) • Редове (записи, n-торки) • Редовете и колоните нямат определена наредба Copyright © 2012 DAVID Holding Company
  • 6. Първичен ключ (primary key) • Една или повече колони • Определя еднозначно всеки запис • Препоръчително е всяка таблица да има първичен ключ Copyright © 2012 DAVID Holding Company
  • 7. Външен ключ (foreign key) • • • • Една или повече колони Асоциира се с първичния ключ на някоя таблица Реализира зависимост между записите в двете таблици Множество записи от вторичната таблица се асоциират с един запис от първичната таблица Copyright © 2012 DAVID Holding Company
  • 8. Индекс (index) • Оптимизира достъпа до записи по определен критерий • Осигурява бързодействие за критични за софтуера манипулации с данните Copyright © 2012 DAVID Holding Company
  • 9. Схема на базата данни (schema) • • • • • Описва структурата на данните Таблици Колони Ключове и други ограничения Индекси Copyright © 2012 DAVID Holding Company
  • 10. Системи за управление на бази данни (DBMS) • Позволяват създаването, поддръжката и употребата на бази данни • Силно оптимизирани за ефективност • Позволяват дефиниране и изпълнение на сложни действия върху данните и създаване на проекции на данните • Някои са предназначени за големи софтуерни системи (enterprise DBMS), други – за малки приложения (lightweight DBMS) Copyright © 2012 DAVID Holding Company
  • 11. Някои разпространени СУБД • • • • • • • Microsoft SQL Server Oracle IBM DB2 MySQL PostgreSQL Microsoft Access SQLite Copyright © 2012 DAVID Holding Company
  • 12. Проектиране на бази данни • Модел на предметната област • Трансформиране на модела в база данни • Нормализиране на базата данни Copyright © 2012 DAVID Holding Company
  • 13. Модел на обектите и зависимостите (Entity/Relationship Model) • Типове обекти (entity types) • Зависимости (relationship sets) • Атрибути Copyright © 2012 DAVID Holding Company
  • 14. Видове зависимости • Едно-към-едно • Едно-към-много • Много-към-много Copyright © 2012 DAVID Holding Company
  • 15. Атрибути • Характеризират множество обекти или зависимост • Ключови атрибути – участват в еднозначното определяне на обекти от множеството Copyright © 2012 DAVID Holding Company
  • 16. Примерен проект: Здравословно хранене • • • • • Производители Марки Продукти Хранителни факти Съставки Copyright © 2012 DAVID Holding Company
  • 17. E/R модел: Здравословно хранене Name Country Producer Name 1 producer of n Description Brand 1 brand of n Ingredient Name m contains n Product Energy value Proteins Amount Fats Carbohydrates Copyright © 2012 DAVID Holding Company Name
  • 18. Изграждане на базата данни • Множество обекти -> таблица • Зависимости едно-към-едно и едно-към-много -> външни ключове • Зависимости много-към-много -> свързваща таблица с външни ключове Copyright © 2012 DAVID Holding Company
  • 19. База данни: Здравословно хранене Producers Brands Products ProducerID BrandID ProductID Name ProducerID BrandID Country Name Name Description EnergyValue Proteins Fats Carbohydrates Ingredients ProductIngredients IngredientID ProductID Name IngredientID Amount Copyright © 2012 DAVID Holding Company
  • 20. Нормализиране на базата данни • Премахване на излишни повторения на данни • Премахване на зависимости между данните • Избягване на аномалии Copyright © 2012 DAVID Holding Company
  • 21. Нормални форми • Формални критерии за нормалност на таблици • Всяка следваща нормална форма допълва предишната с по-строги критерии • Полезни, но не винаги постижими или оптимални Copyright © 2012 DAVID Holding Company
  • 22. Малко дефиниции • Суперключ - множество от колони в таблица, което еднозначно определя всеки запис • Минимален суперключ – суперключ, никое подмножество на който не е суперключ • Неключова колона – колона, която не участва в никой минимален суперключ на таблицата Copyright © 2012 DAVID Holding Company
  • 23. Първа нормална форма (1NF) Няма колона, която може да съдържа множества. Таблицата не съдържа подтаблици. Copyright © 2012 DAVID Holding Company
  • 24. Първа нормална форма (1NF) Ученик Георги фехтовка, тенис Иван баскетбол, фехтовка Мария Copyright © 2012 DAVID Holding Company Спорт лека атлетика, баскетбол, тенис
  • 25. Първа нормална форма (1NF) Ученик Георги фехтовка Георги тенис Иван баскетбол Иван фехтовка Мария лека атлетика Мария баскетбол Мария Copyright © 2012 DAVID Holding Company Спорт тенис
  • 26. Втора нормална форма (2NF) Не съществуват минимален суперключ, за който стойностите на някоя неключова колона да се определят еднозначно от негово подмножество. Всяка неключова колона се определя еднозначно от целия минимален суперключ. Copyright © 2012 DAVID Holding Company
  • 27. Втора нормална форма (2NF) Ученик Училище Спорт Георги ПГ „Иван Хаджиенов“ фехтовка Георги ПГ „Иван Хаджиенов“ тенис Иван СОУ „Антим I“ баскетбол Иван СОУ „Антим I“ фехтовка Мария ПМГ „Никола Обрешков“ лека атлетика Мария ПМГ „Никола Обрешков“ баскетбол Мария ПМГ „Никола Обрешков“ тенис Copyright © 2012 DAVID Holding Company
  • 28. Втора нормална форма (2NF) Ученик Училище Ученик Спорт Георги ПГ „Иван Хаджиенов“ Георги фехтовка Иван СОУ „Антим I“ Георги тенис Мария ПМГ „Никола Обрешков“ Иван баскетбол Иван фехтовка Петър лека атлетика Петър баскетбол Петър тенис Copyright © 2012 DAVID Holding Company
  • 29. Други нормални форми • 3NF, BCNF, 4NF, 5NF • Няма да ги разглеждаме в подробности • За повечето таблици е препоръчителна BCNF Copyright © 2012 DAVID Holding Company
  • 30. Structured Query Language (SQL) • • • • Специализиран език за програмиране Управление и работа с данните в СУБД Дели се на три части: DDL, DCL и DML Стандартизиран, но всяка СУБД поддържа собствен диалект • Microsoft SQL Server използва T-SQL диалекта Copyright © 2012 DAVID Holding Company
  • 31. Синтаксис на SQL • • • • Декларативен език за програмиране Съждения Не се разграничава главни и малки букви По конвенция ключовите думи се пишат с главни букви Copyright © 2012 DAVID Holding Company
  • 32. Идентификатори • Поредици от букви, долни черти, цифри, която не започва с цифра • Поредици от символи, заградени в квадратни скоби • Поредици от символи, заградени в двойни кавички test, TEST, TeSt, [test], [TEST], "test", "TEST" Copyright © 2012 DAVID Holding Company
  • 33. Запазени и стандартни думи • Могат да се ползват като идентификатори, когато се заградят в квадратни скоби или кавички • Някои от тях могат да се ползват като идентификатори и без да бъдат заградени, когато не са в подходящия контекст (но не е препоръчително) Copyright © 2012 DAVID Holding Company
  • 34. Променливи • Незаградени идентификатори с префикс @ • Декларират се с DECLARE • Обхват - блокът от съждения, в който са дефинирани Copyright © 2012 DAVID Holding Company
  • 35. Data Definition Language (DDL) • Създаване, модификация, изтриване на таблици, изгледи, съхранени процедури, функции, тригери, индекси, потребителски типове данни • Описване и модифициране на схемата на базата данни • Започват с CREATE, ALTER, DROP или TRUNCATE Copyright © 2012 DAVID Holding Company
  • 36. Създаване на таблица CREATE TABLE [Producers] ( [ProducerID] int [Name] nvarchar(100) [Country] nvarchar(100) NOT NULL IDENTITY(1, 1), NOT NULL, NULL, CONSTRAINT [PK_Producers] PRIMARY KEY ([ProducerID]) ) GO Copyright © 2012 DAVID Holding Company
  • 37. Създаване на таблица CREATE TABLE [Brands] ( [BrandID] int [ProducerID] int [Name] nvarchar(100) NOT NULL IDENTITY(1, 1), NOT NULL, NOT NULL, CONSTRAINT [PK_Brands] PRIMARY KEY ([BrandID]), CONSTRAINT [FK_Brands_Producer] FOREIGN KEY ([ProducerID]) REFERENCES [Producers] ([ProducerID]) ON DELETE CASCADE ) GO Copyright © 2012 DAVID Holding Company
  • 38. Модифициране на таблица ALTER TABLE [Brands] ADD [Description] nvarchar(MAX) GO Copyright © 2012 DAVID Holding Company NULL
  • 39. Изтриване на таблица DROP TABLE [Brands] GO Copyright © 2012 DAVID Holding Company
  • 40. Изпразване съдържанието на таблица TRUNCATE TABLE [Brands] GO Copyright © 2012 DAVID Holding Company
  • 41. Съхранени процедури CREATE PROCEDURE [CreateProducer] @vName nvarchar(100), @vCountry nvarchar(100), @vProducerID int OUTPUT AS INSERT INTO [Producers] ([Name], [Country]) VALUES (@vName, @vCountry) SELECT @vProducerID = SCOPE_IDENTITY() GO Copyright © 2012 DAVID Holding Company
  • 42. Функции CREATE FUNCTION [GetProducerBrandsCount] (@vProducerID int) RETURNS int BEGIN DECLARE @varCount int SELECT @varCount = COUNT(*) FROM [Brands] WHERE ([ProducerID] = @vProducerID) RETURN @varCount END Copyright © 2012 DAVID Holding Company
  • 43. Изгледи CREATE VIEW [BrandProducers] AS SELECT [B].[BrandID], [B].[Name] AS [BrandName], [P].[Name] AS [ProducerName] FROM [Brands] AS [B] INNER JOIN [Producers] AS [P] ON ([B].[ProducerID] = [P].[ProducerID]) GO Copyright © 2012 DAVID Holding Company
  • 44. Индекси CREATE INDEX [IX_Producers] ON [Producers] ( [Country] ASC, [Name] ASC ) GO DROP INDEX [IX_Producers] ON [Producers] GO Copyright © 2012 DAVID Holding Company
  • 45. Data Control Language (DCL) • Управление на достъпа до обекти в базата данни • Започват с GRANT, REVOKE или DENY Copyright © 2012 DAVID Holding Company
  • 46. Data Control Language (DCL) GRANT SELECT, INSERT, UPDATE, DELETE ON [Producers] GO TO [someone] DENY INSERT, UPDATE, DELETE GO ON [Producers] TO [someone] REVOKE DELETE GO ON [Producers] ТО [someone] Copyright © 2012 DAVID Holding Company
  • 47. Data Manipulation Language (DML) • Записване, променяне, изтриване и извличане на данни • Приложенията, използващи бази данни, използват предимно DML • Започват с SELECT, INSERT, UPDATE или DELETE Copyright © 2012 DAVID Holding Company
  • 48. SELECT съждения • Извличат информация от базата данни • Най-често използваните съждения • Резултатът обикновено е набор от записи (rowset) SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ... Copyright © 2012 DAVID Holding Company
  • 49. SELECT и FROM • SELECT определя колоните, които да участват в резултата • FROM определя таблицата (или таблиците), от която се извличат данните SELECT * FROM [Producers] SELECT [BrandID], [Name] FROM [Brands] Copyright © 2012 DAVID Holding Company
  • 50. Филтриране • WHERE посочва критерий (или критерии), по който да се отсеят записите в резултата • =, <>, <, <=, >, >= • EXISTS, IS NULL, LIKE, IN • NOT, OR, AND SELECT * FROM [Products] WHERE ([ProductID] > 10) SELECT * FROM [Products] WHERE ([BrandID] = 2) SELECT * FROM [Brands] WHERE ([Name] IN (N'Coca-Cola', N'Fanta', N'Sprite', N'Schweppes')) AND ([Description] IS NOT NULL) Copyright © 2012 DAVID Holding Company
  • 51. Влагане на заявки • Често се налага влагане на заявки – например в SELECT или WHERE клаузите SELECT * FROM [Brands] WHERE ([BrandID] NOT IN (SELECT DISTINCT [BrandID] FROM [Products])) Copyright © 2012 DAVID Holding Company
  • 52. Сортиране • ORDER BY посочва колона или редица от колони, по които да се подредят записите в резултата SELECT * FROM [Brands] ORDER BY [Name] SELECT * FROM [Products] ORDER BY [EnergyValue] DESC, [Name] ASC Copyright © 2012 DAVID Holding Company
  • 53. Агрегиране • Получаване на единична стойност от стойностите на всички записи за дадена колона • COUNT, SUM, MAX, MIN, AVG SELECT COUNT([Description]) FROM [Brands] SELECT COUNT(*) FROM [Products] WHERE ([BrandID] = 4) SELECT COUNT(DISTINCT [BrandID]) FROM [Products] Copyright © 2012 DAVID Holding Company
  • 54. Групиране • Позволява прилагането на агрегатни функции върху част от записите в таблица • GROUP BY указва всички колони, по които трябва да се групират записите • HAVING указва допълнителен критерий, по който да се отсеят групираните резултати SELECT [BrandID], AVG([EnergyValue]) FROM [Products] GROUP BY [BrandID] SELECT [BrandID], COUNT(*) FROM [Products] GROUP BY [BrandID] HAVING (COUNT(*) > 1) Copyright © 2012 DAVID Holding Company
  • 55. Съединения • Служат за комбиниране на записи от няколко таблици • Прилагат се JOIN оператори във FROM клаузата • Могат да се свързват повече от две таблици с последователно прилагане на JOIN оператори Copyright © 2012 DAVID Holding Company
  • 56. INNER JOIN • Комбинира всеки запис от едната таблица с един или повече записи от другата таблица по зададен критерий • Премахва записите, които не могат да се свържат с никой запис от другата таблица SELECT [P].[ProductID], [B].[Name] AS [BrandName], [P].[Name] AS [ProductName] FROM [Products] AS [P] INNER JOIN [Brands] AS [B] ON ([P].[BrandID] = [B].[BrandID]) Copyright © 2012 DAVID Holding Company
  • 57. OUTER JOIN • Комбинира всеки запис от едната таблица с един или повече записи от другата таблица по зададен критерий • Не премахва записите от първата таблица, които не могат да се свържат с нито един запис от втората SELECT [P].[Name] AS [ProducerName], COUNT([B].[BrandID]) AS [BrandCount] FROM [Producers] AS [P] LEFT OUTER JOIN [Brands] AS [B] ON ([P].[ProducerID] = [B].[ProducerID]) GROUP BY [P].[Name] Copyright © 2012 DAVID Holding Company
  • 58. INSERT съждения • Създават нови записи в таблица • Могат да се комбинират със SELECT съждения за автоматично генериране на данните в новите записи INSERT INTO ... (...) VALUES (...) INSERT INTO ... (...) SELECT ... INSERT INTO [Brands] ([ProducerID], [Name]) VALUES (5, 'Lindt') INSERT INTO [Products] ([BrandID], [Name], [EnergyValue]) SELECT 9, [Name], [Energy] FROM [LegacyProducts] WHERE ([Brand] = N'Lindt') Copyright © 2012 DAVID Holding Company
  • 59. UPDATE съждения • Променят съдържанието на съществуващи записи • По подразбиране променят всички записи в таблицата UPDATE ... SET ... WHERE ... UPDATE [Brands] SET [Description] = N'Швейцарско качество!' WHERE ([Name] = N'Lindt') UPDATE [Products] SET [EnergyValue] = [EnergyValue]*4.184 Copyright © 2012 DAVID Holding Company
  • 60. DELETE съждения • Изтриват записи от таблица • По подразбиране изтриват всички записи от таблицата DELETE FROM ... WHERE ... DELETE FROM [Products] WHERE ([EnergyValue] < 0) Copyright © 2012 DAVID Holding Company
  • 61. Трансакции • Поредици от операции • Изпълняват се цялостно и независимо от всички останали трансакции • Гарантиране консистентността на данните Copyright © 2012 DAVID Holding Company
  • 63. Трансакции в SQL BEGIN TRANSACTION COMMIT TRANSACTION ROLLBACK TRANSACTION Copyright © 2012 DAVID Holding Company
  • 64. ADO.NET • • • • Част от .NET Framework Наследник на ActiveX Data Objects (ADO) Удобни начини за достъп до бази данни Минимална зависимост от избора на СУБД Copyright © 2012 DAVID Holding Company
  • 65. ADO.NET доставчици (data providers) • • • • • Data Provider for SQL Server Data Provider for OLE DB Data Provider for ODBC Data Provider for Oracle Data Provider for SQL Server Compact 4.0 Copyright © 2012 DAVID Holding Company
  • 66. Модели за достъп до данните в ADO.NET • • • • Свързан модел Несвързан модел LINQ to SQL Entity Framework Copyright © 2012 DAVID Holding Company
  • 67. Connection strings • Служат за осъществяване на връзката с базата данни • Представляват поредица от двойки „параметър=стойност“, разделени с ; • Различните доставчици поддържат различни параметри Server=(local); Database=HealthyFood; Integrated Security=SSPI Server=(local); Database=HealthyFood; Integrated Security=False; User ID=sa; Password=$secret$; Persist Security Info=False Copyright © 2012 DAVID Holding Company
  • 68. Основни параметри на connection string • • • • • • Server Database Integrated Security User ID Password Persist Security Info Copyright © 2012 DAVID Holding Company
  • 69. Автоматично генериране на connection string • Използва се SqlConnectionStringBuilder • Параметрите на връзката са свойства на обекта Copyright © 2012 DAVID Holding Company
  • 70. Съхраняване на connection string в конфигурационен файл • Позволява промяна без прекомпилиране на приложението • Записва се в секцията <connectionStrings> • Достъпва се през ConfigurationManager.ConnectionStrings <configuration> <connectionStrings> <add name="connection" providerName="System.Data.SqlClient" connectionString="Server=(local); Database=HealthyFood; Integrated Security=SSPI" /> </connectionStrings> </configuration> connection.ConnectionString = ConfigurationManager .ConnectionStrings["connection"].ConnectionString; Copyright © 2012 DAVID Holding Company
  • 71. SqlConnection • Осъществява връзката с базата данни • Получава connection string • Open() • IDisposable using (var connection = new SqlConnection()) { connection.ConnectionString = ConfigurationManager .ConnectionStrings["connection"].ConnectionString; connection.Open(); // операции върху базата... } Copyright © 2012 DAVID Holding Company
  • 72. SqlCommand • Служи за изпълнение на заявки • Получава отворен SqlConnection • ExecuteNonQuery(), ExecuteScalar(), ExecuteReader() • IDisposable using (SqlCommand command = connection.CreateCommand()) { command.CommandText = "SELECT COUNT(*) FROM [Producers]"; int producerCount = (int)command.ExecuteScalar(); Console.WriteLine("Producers count: {0}", producerCount); } Copyright © 2012 DAVID Holding Company
  • 73. SqlCommand - ExecuteReader using (SqlCommand command = connection.CreateCommand()) { command.CommandText = "SELECT [ProducerID], [Name] FROM [Producers]"; using (DbDataReader reader = command.ExecuteReader()) { while (reader.Read()) { Console.WriteLine("ProducerID: {0}; Name: {1}", reader["ProducerID"], reader["Name"]); } } } Copyright © 2012 DAVID Holding Company
  • 74. SqlCommand - параметри • Служат за динамично предаване на стойности • Име, тип и стойност • SqlCommand.Parameters Console.Write("Input producer ID: "); int producerID = Convert.ToInt32(Console.ReadLine()); using (SqlCommand command = connection.CreateCommand()) { command.CommandText = @"SELECT [BrandID], [Name] FROM [Brands] WHERE ([ProducerID] = @producer_id)"; command.Parameters.AddWithValue("@producer_id", producerID); using (DbDataReader reader = command.ExecuteReader()) { while (reader.Read()) { Console.WriteLine("BrandID: {0}; Name: {1}", reader["BrandID"], reader["Name"]); } } } Copyright © 2012 DAVID Holding Company
  • 75. SQL injection атаки • Пробив в сигурността на базата данни • Динамично генериране на заявки с конкатениране на низове Console.WriteLine("Input brand name to search for: "); string name = Console.ReadLine(); using (SqlCommand command = connection.CreateCommand()) { command.CommandText = @"SELECT [BrandID], [Name] FROM [Brands] WHERE ([Name] = N'" + name + "')"; using (DbDataReader reader = command.ExecuteReader()) { while (reader.Read()) { Console.WriteLine("BrandID: {0}; Name: {1}", reader["BrandID"], reader["Name"]); } } } Copyright © 2012 DAVID Holding Company
  • 76. SQL injection атаки '); DELETE FROM [Products];-SELECT [ProductID], [Name] FROM [Products] WHERE ([Name] = N''); DELETE FROM [Products];--') Copyright © 2012 DAVID Holding Company
  • 77. SQL injection атаки Правилна имплементация – използване на параметри Console.WriteLine("Input brand name to search for: "); string name = Console.ReadLine(); using (SqlCommand command = connection.CreateCommand()) { command.CommandText = @"SELECT [BrandID], [Name] FROM [Brands] WHERE ([Name] = @name)"; command.Parameters.AddWithValue("@name", name); using (DbDataReader reader = command.ExecuteReader()) { while (reader.Read()) { Console.WriteLine("BrandID: {0}; Name: {1}", reader["BrandID"], reader["Name"]); } } } Copyright © 2012 DAVID Holding Company
  • 78. SqlCommand – съхранени процедури • CommandType.StoredProcedure • Parameters using (SqlCommand command = connection.CreateCommand()) { command.CommandType = CommandType.StoredProcedure; command.CommandText = "[CreateProduct]"; command.Parameters.AddWithValue("@vBrandID", 5); command.Parameters.AddWithValue("@vName", "Шоколад Milka алпийско мляко"); command.Parameters.AddWithValue("@vEnergyValue", (decimal)532); command.Parameters.AddWithValue("@vProteins", (decimal)6.8); command.Parameters.AddWithValue("@vFats", (decimal)29.6); command.Parameters.AddWithValue("@vCarbohydrates", (decimal)58); command.Parameters.Add("@vProductID", SqlDbType.Int).Direction = ParameterDirection.Output; command.ExecuteNonQuery(); Console.WriteLine("Created product ID: {0}", (int)command.Parameters["@vProductID"].Value); } Copyright © 2012 DAVID Holding Company
  • 79. Трансакции в ADO.NET • TransactionScope • Complete() • IDisposable using (var ts = new TransactionScope()) using (var connection = new SqlConnection()) { connection.ConnectionString = ConfigurationManager .ConnectionStrings["connection"].ConnectionString; connection.Open(); // операции в трансакция ts.Complete(); } Copyright © 2012 DAVID Holding Company
  • 80. Императивни езици за програмиране • C, C++, C#, Java, Pascal, Visual Basic,… • Поредици от инструкции (съждения) • Близки до машинния език Copyright © 2012 DAVID Holding Company
  • 81. Функционални езици за програмиране • • • • Scheme, Haskell, F#, Scala,… Композиране на функции Изрази Близки до математиката Copyright © 2012 DAVID Holding Company
  • 82. Умножение с константа Императивна версия: function MulBy2(x) { return x*2; } Copyright © 2012 DAVID Holding Company
  • 83. Умножение с константа Фунцкионална версия: function MulBy2(x) = x*2; Copyright © 2012 DAVID Holding Company
  • 84. Умножение на всички елементи на списък с константа Императивна версия: function MulElementsBy2(list) { result = EmptyList(); foreach (x in list) { AddElement(x*2, result); } return result; } Copyright © 2012 DAVID Holding Company
  • 85. Умножение на всички елементи на списък с константа Функционална версия: function MulElementsBy2(list) = Map(MulBy2, list); Copyright © 2012 DAVID Holding Company
  • 86. Отсяване на елементи от списък Императивна версия: function GetPositiveElements(list) { result = EmptyList(); foreach (x in list) { if (x > 0) { AddElement(x, result); } } return result; } Copyright © 2012 DAVID Holding Company
  • 87. Отсяване на елементи от списък Функционална версия: function IsPositive(x) = x > 0; function GetPositiveElements(list) = Filter(IsPositive, list); Copyright © 2012 DAVID Holding Company
  • 88. Намиране сумата на елементите на списък Императивна версия: function Sum(list) { result = 0; foreach (x in list) { result += x; } return result; } Copyright © 2012 DAVID Holding Company
  • 89. Намиране сумата на елементите на списък Функционална версия: function Add(x, y) = x + y; function Sum(list) = Fold(Add, 0, list); Copyright © 2012 DAVID Holding Company
  • 90. Намиране средно аритметично на елементите на списък Императивна версия: function Average(list) { sum = 0; count = 0; foreach (x in list) { sum += x; count++; } return sum/count; } Copyright © 2012 DAVID Holding Company
  • 91. Намиране средно аритметично на елементите на списък Функционална версия: function Add1(x, y) = x + 1; function Count(list) = Fold(Add1, 0, list); function Average(list) = Sum(list)/Count(list); Copyright © 2012 DAVID Holding Company
  • 92. Разширителни методи на IEnumerable<T> • Въведени в .NET Framework 3.5 • Улесняват прилагането на често използвани операции върху колекции • Следват функционалната парадигма • System.Linq.Enumerable Copyright © 2012 DAVID Holding Company
  • 93. Разширителни методи на IEnumerable<T> IEnumerable<U> Select<T, U>(this IEnumerable<T> source, Func<T, U> selector) IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> predicate) U Aggregate<T, U>(this IEnumerable<T> source, U seed, Func<U, T, U> function) IEnumerable<T> Skip<T>(this IEnumerable<T> source, int count) IEnumerable<T> Take<T>(this IEnumerable<T> source, int count) Copyright © 2012 DAVID Holding Company
  • 94. Разширителни методи на IEnumerable<T> отложено изпълнение var numbers = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; IEnumerable<int> newNumbers = numbers .Where(x => x % 2 == 0) .Select(x => x*2); // в този момент newNumbers съхранява информация за операциите, // които трябва да се извършат numbers.Add(10); // точно преди началото на обхождането на newNumbers с foreach, // операциите се изпълняват и резултатът се подава на цикъла foreach (int n in newNumbers) { Console.WriteLine(n); } Copyright © 2012 DAVID Holding Company
  • 95. Разширителни методи на IEnumerable<T> • First, Last, FirstOrDefault, LastOrDefault • Sum, Min, Max, Average, Count • ToList, ToArray, ToDictionary Copyright © 2012 DAVID Holding Company
  • 96. Разширителни методи на IEnumerable<T> сортировка IOrderedEnumerable<T> OrderBy<T, U>(this IEnumerable<T> source, Func<T, U> keySelector) IOrderedEnumerable<T> OrderByDescending<T, U>( this IEnumerable<T> source, Func<T, U> keySelector) IOrderedEnumerable<T> ThenBy<T, U>(this IOrderedEnumerable<T> source, Func<T, U> keySelector) IOrderedEnumerable<T> ThenByDescending<T, U>( this IOrderedEnumerable<T> source, Func<T, U> keySelector) Copyright © 2012 DAVID Holding Company
  • 97. Разширителни методи на IEnumerable<T> групиране IEnumerable<IGrouping<U, T>> GroupBy<T, U>(this IEnumerable<T> source, Func<T, U> keySelector) Copyright © 2012 DAVID Holding Company
  • 98. Разширителни методи на IEnumerable<T> съединения IEnumerable<W> Join<T, U, V, W>(this IEnumerable<T> first, IEnumerable<U> second, Func<T, V> firstKeySelector, Func<U, V> secondKeySelector, Func<T, U, W> resultSelector) IEnumerable<W> GroupJoin<T, U, V, W>( this IEnumerable<T> first, IEnumerable<U> second, Func<T, V> firstKeySelector, Func<U, V> secondKeySelector, Func<T, IEnumerable<U>, W> resultSelector) Copyright © 2012 DAVID Holding Company
  • 99. Language INtegrated Query (LINQ) • Също въведен в .NET Framework 3.5 • Синтаксис подобен на SQL • Трансформира се в извиквания на разширителните методи на IEnumerable<T> и IQueryable<T> • Няколко различни имплементации Copyright © 2012 DAVID Holding Company
  • 100. LINQ - примери var example1 = from n in numbers select n*2; var example1 = numbers.Select(n => n*2); Copyright © 2012 DAVID Holding Company
  • 101. LINQ - примери var example2 = from n in numbers where n > 15 orderby n % 4, n % 7 descending select n; var example2 = numbers .Where(n => n > 15) .OrderBy(n => n % 4) .ThenByDescending(n => n % 7); Copyright © 2012 DAVID Holding Company
  • 102. LINQ - примери var example3 = from n in numbers group n by n % 3 into ng where ng.Count() == 2 select ng; var example3 = numbers .GroupBy(n => n % 3) .Where(ng => ng.Count() == 2); Copyright © 2012 DAVID Holding Company
  • 103. LINQ - примери var example4 = from n in numbers join m in numbers on n % 3 equals m % 3 select Tuple.Create(n, m); var example4 = numbers .Join(numbers, n => n % 3, m => m % 3, (n, m) => Tuple.Create(n, m)); Copyright © 2012 DAVID Holding Company
  • 104. IQueryable<T> • Наследява IEnumerable<T> • Различна имплементация на повечето разширителни методи на IEnumerable<T> • Служи за трансформиране на LINQ заявки към SQL, XPath и др. • System.Linq.Queryable Copyright © 2012 DAVID Holding Company
  • 105. Имплементации на LINQ • • • • • LINQ to Objects LINQ to XML LINQ to Dataset LINQ to SQL LINQ to Entities Copyright © 2012 DAVID Holding Company
  • 106. LINQ to SQL • Част от ADO.NET • Въведен в .NET Framework 3.5 • Object-Relational Mapping (ORM) – ръчно дефиниране или описване с DBML • Само с Data Provider for SQL Server • System.Data.Linq Copyright © 2012 DAVID Holding Company
  • 107. Ръчно описване на ORM модела • Прави се с атрибути • System.Data.Linq.Mapping Copyright © 2012 DAVID Holding Company
  • 108. Ръчно описване на ORM модела - таблици • Table • Column [Table(Name = "Producers")] public class Producer { [Column(IsPrimaryKey = true)] public int ProducerID { get; set; } [Column(CanBeNull = false)] public string Name { get; set; } [Column] public string Country { get; set; } } Copyright © 2012 DAVID Holding Company
  • 109. Ръчно описване на ORM модела - връзки • Association • EntitySet<T>, EntityRef<T> [Table(Name = "Producers")] public class Producer { private EntitySet<Brand> _brands; [Column(IsPrimaryKey = true)] public int ProducerID { get; set; } [Column(CanBeNull = false)] public string Name { get; set; } [Column] public string Country { get; set; } [Association(Storage = "_brands", OtherKey = "ProducerID")] public EntitySet<Brand> Brands { get { return _brands; } set { _brands.Assign(value); } } } Copyright © 2012 DAVID Holding Company
  • 110. Ръчно описване на ORM модела - връзки [Table(Name = "Brands")] public class Brand { private EntityRef<Producer> _producer; [Column(IsPrimaryKey = true)] public int BrandID { get; set; } [Column] public int ProducerID { get; set; } [Column(CanBeNull = false)] public string Name { get; set; } [Column] public string Description { get; set; } [Association(Storage = "_producer", ThisKey = "ProducerID")] public Producer Producer { get { return _producer.Entity; } set { _producer.Entity = value; } } } Copyright © 2012 DAVID Holding Company
  • 111. Ръчно описване на ORM модела - контекст • DataContext public class HealthyFoodContext : DataContext { public HealthyFoodContext(string connectionString) : base(connectionString) { } public Table<Producer> Producers { get { return GetTable<Producer>(); } } public Table<Brand> Brands { get { return GetTable<Brand>(); } } } string connectionString = ConfigurationManager.ConnectionStrings["connection"].ConnectionString; var context = new HealthyFoodContext(connectionString); Copyright © 2012 DAVID Holding Company
  • 112. LINQ to SQL заявки - примери IEnumerable<Brand> brands = from b in context.Brands select b; IEnumerable<Brand> brands = from b in context.Brands where b.BrandID > 3 select b; var brands = from b in context.Brands select new { BrandID = b.BrandID, BrandName = b.Name }; var brands = from b in context.Brands select new { ProducerName = b.Producer.Name, BrandName = b.Name }; IEnumerable<Brand> brands = context.Producers .Where(p => p.Name != "Kraft Foods") .SelectMany(p => p.Brands); Producer producer = context.Producers.Single(p => p.ProducerID == 3); Copyright © 2012 DAVID Holding Company
  • 113. Описване на ORM модела с DBML • Специализиран XML документ • LINQ to SQL Classes файлов шаблон • Автоматично генериране на C# код • partial класове - добавяне на методи/свойства във външни файлове Copyright © 2012 DAVID Holding Company
  • 114. ORM модел: Здравословно хранене Copyright © 2012 DAVID Holding Company
  • 115. LINQ to SQL – добавяне на записи Brand brand = context.Brands.Single(b => b.BrandID == 5); var product = new Product { Name = "Шоколад Milka алпийско мляко", EnergyValue = 532, }; brand.Products.Add(product); Copyright © 2012 DAVID Holding Company
  • 116. LINQ to SQL – редактиране на записи Product product = context.Products.Single(p => p.ProductID == 19); product.Proteins = (decimal)6.8; product.Fats = (decimal)29.6; product.Carbohydrates = (decimal)58; Copyright © 2012 DAVID Holding Company
  • 117. LINQ to SQL – изтриване на записи Product product = context.Products.Single(p => p.ProductID == 19); context.Products.DeleteOnSubmit(product); Copyright © 2012 DAVID Holding Company
  • 118. LINQ to SQL – записване на промените context.SubmitChanges(); Copyright © 2012 DAVID Holding Company
  • 119. Полезни връзки • T-SQL - http://msdn.microsoft.com/enus/library/ms189826%28v=SQL.90%29.aspx • ADO.NET - http://msdn.microsoft.com/enus/library/e80y5yhx%28v=vs.100%29.aspx • LINQ to SQL - http://msdn.microsoft.com/enus/library/bb386976%28v=vs.100%29.aspx Copyright © 2012 DAVID Holding Company
  • 120. Благодаря за вниманието! • Въпроси? • musashi.bg@gmail.com Copyright © 2012 DAVID Holding Company