slide1 n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL PowerPoint Presentation
Download Presentation
Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL

Loading in 2 Seconds...

play fullscreen
1 / 120

Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL - PowerPoint PPT Presentation


  • 133 Views
  • Uploaded on

Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL. Александър Далемски m usashi.bg@gmail.com. За какво ще говорим. Релационни бази данни Проектиране на бази данни Structured Query Language (SQL) ADO.NET Language INtegrated Query (LINQ) LINQ to SQL. Бази данни.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Бази данни Системи за управление на бази данни ADO.NET LINQ to SQL' - quyn-gray


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
slide1

Бази данни

Системи за управление на бази данни

ADO.NET

LINQ to SQL

Александър Далемски

musashi.bg@gmail.com

slide2

За какво ще говорим

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

Бази данни

  • Структурирана информация
  • Взаимосвързана информация
  • Организирана в удобен за софтуерна обработка вид
slide4

Релационни бази данни

  • Най-широко разпространени
  • Организират информацията във формално дефинирани таблици
slide5

Таблица (релация)

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

Първичен ключ (primary key)

  • Една или повече колони
  • Определя еднозначно всеки запис
  • Препоръчително е всяка таблица да има първичен ключ
slide7

Външен ключ (foreign key)

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

Индекс (index)

  • Оптимизира достъпа до записи по определен критерий
  • Осигурява бързодействие за критични за софтуера манипулации с данните
slide9

Схема на базата данни (schema)

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

Системи за управление на бази данни (DBMS)

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

Някои разпространени СУБД

  • Microsoft SQL Server
  • Oracle
  • IBM DB2
  • MySQL
  • PostgreSQL
  • Microsoft Access
  • SQLite
slide12

Проектиране на бази данни

  • Модел на предметната област
  • Трансформиране на модела в база данни
  • Нормализиране на базата данни
slide13

Модел на обектите и зависимостите

(Entity/Relationship Model)

  • Типове обекти (entity types)
  • Зависимости (relationship sets)
  • Атрибути
slide14

Видове зависимости

  • Едно-към-едно
  • Едно-към-много
  • Много-към-много
slide15

Атрибути

  • Характеризират множество обекти или зависимост
  • Ключови атрибути – участват в еднозначното определяне на обекти от множеството
slide16

Примерен проект: Здравословно хранене

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

Name

Country

Name

Description

1

n

producer of

Producer

Brand

E/R модел: Здравословно хранене

1

brand of

n

Name

Ingredient

contains

Product

Energy value

m

n

Proteins

Name

Amount

Fats

Carbohydrates

slide18

Изграждане на базата данни

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

Нормализиране на базата данни

  • Премахване на излишни повторения на данни
  • Премахване на зависимости между данните
  • Избягване на аномалии
slide21

Нормални форми

  • Формални критерии за нормалност на таблици
  • Всяка следваща нормална форма допълва предишната с по-строги критерии
  • Полезни, но не винаги постижими или оптимални
slide22

Малко дефиниции

  • Суперключ - множество от колони в таблица, което еднозначно определя всеки запис
  • Минимален суперключ – суперключ, никое подмножество на който не е суперключ
  • Неключова колона – колона, която не участва в никой минимален суперключ на таблицата
slide23

Първа нормална форма (1NF)

Няма колона, която може да съдържа множества.

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

slide26

Втора нормална форма (2NF)

Не съществуват минимален суперключ, за който стойностите на някоя неключова колона да се определят еднозначно от негово подмножество.

Всяка неключова колона се определя еднозначно от целия минимален суперключ.

slide29

Други нормални форми

  • 3NF, BCNF, 4NF, 5NF
  • Няма да ги разглеждаме в подробности
  • За повечето таблици е препоръчителна BCNF
slide30

Structured Query Language (SQL)

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

Синтаксис на SQL

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

Идентификатори

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

Запазени и стандартни думи

  • Могат да се ползват като идентификатори, когато се заградят в квадратни скоби или кавички
  • Някои от тях могат да се ползват като идентификатори и без да бъдат заградени, когато не са в подходящия контекст (но не е препоръчително)
slide34

Променливи

  • Незаградени идентификатори с префикс @
  • Декларират се с DECLARE
  • Обхват - блокът от съждения, в който са дефинирани
slide35

Data Definition Language (DDL)

  • Създаване, модификация, изтриване на таблици, изгледи, съхранени процедури, функции, тригери, индекси, потребителски типове данни
  • Описване и модифициране на схемата на базата данни
  • Започват с CREATE, ALTER, DROPилиTRUNCATE
slide36

Създаване на таблица

CREATETABLE[Producers]([ProducerID]intNOTNULLIDENTITY(1, 1),[Name]nvarchar(100)NOTNULL,[Country]nvarchar(100)NULL,CONSTRAINT[PK_Producers]PRIMARYKEY ([ProducerID]))GO

slide37

Създаване на таблица

CREATETABLE[Brands]([BrandID]intNOTNULLIDENTITY(1, 1),[ProducerID]intNOTNULL,[Name]nvarchar(100)NOTNULL,CONSTRAINT[PK_Brands]PRIMARYKEY ([BrandID]),CONSTRAINT[FK_Brands_Producer]FOREIGNKEY ([ProducerID])REFERENCES[Producers]([ProducerID])ONDELETECASCADE)GO

slide38

Модифициране на таблица

ALTERTABLE[Brands]ADD[Description]nvarchar(MAX)NULLGO

slide40

Изпразване съдържанието на таблица

TRUNCATETABLE[Brands]GO

slide41

Съхранени процедури

CREATEPROCEDURE[CreateProducer]@vNamenvarchar(100),@vCountrynvarchar(100),@vProducerIDintOUTPUTASINSERTINTO[Producers]([Name],[Country])VALUES (@vName,@vCountry)SELECT@vProducerID=SCOPE_IDENTITY()GO

slide42

Функции

CREATEFUNCTION[GetProducerBrandsCount](@vProducerIDint)RETURNSintBEGINDECLARE@varCountintSELECT@varCount=COUNT(*)FROM[Brands]WHERE ([ProducerID]=@vProducerID)RETURN@varCountEND

slide43

Изгледи

CREATEVIEW[BrandProducers]ASSELECT[B].[BrandID],[B].[Name]AS[BrandName],[P].[Name]AS[ProducerName]FROM[Brands]AS[B]INNERJOIN[Producers]AS[P]ON ([B].[ProducerID]= [P].[ProducerID])GO

slide44

Индекси

CREATEINDEX[IX_Producers]ON[Producers]([Country]ASC,[Name]ASC)GO

DROPINDEX[IX_Producers]ON[Producers]GO

slide45

Data Control Language (DCL)

  • Управление на достъпа до обекти в базата данни
  • Започват с GRANT, REVOKEили DENY
slide46

Data Control Language (DCL)

GRANTSELECT,INSERT,UPDATE,DELETEON[Producers]TO[someone]GO

DENYINSERT,UPDATE,DELETEON[Producers]TO[someone]GO

REVOKEDELETEON[Producers]ТО[someone]GO

slide47

Data Manipulation Language (DML)

  • Записване, променяне, изтриване и извличане на данни
  • Приложенията, използващи бази данни, използват предимно DML
  • Започват с SELECT,INSERT, UPDATEили DELETE
slide48

SELECT съждения

  • Извличат информация от базата данни
  • Най-често използваните съждения
  • Резултатът обикновено е набор от записи (rowset)
  • SELECT...FROM...WHERE...GROUPBY...HAVING...ORDERBY...
slide49

SELECT и FROM

  • SELECTопределя колоните, които да участват в резултата
  • FROM определя таблицата (или таблиците), от която се извличат данните
  • SELECT*FROM[Producers]
  • SELECT[BrandID],[Name]FROM[Brands]
slide50

Филтриране

  • 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]ISNOTNULL)
slide51

Влагане на заявки

  • Често се налагавлагане на заявки – например в SELECTили WHEREклаузите
  • SELECT*FROM[Brands]WHERE ([BrandID]NOTIN(SELECTDISTINCT[BrandID]FROM[Products]))
slide52

Сортиране

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

Агрегиране

  • Получаване на единична стойност от стойностите на всички записи за дадена колона
  • COUNT, SUM, MAX, MIN, AVG
  • SELECTCOUNT([Description])FROM[Brands]
  • SELECTCOUNT(*)FROM[Products]WHERE ([BrandID]= 4)
  • SELECTCOUNT(DISTINCT[BrandID])FROM[Products]
slide54

Групиране

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

Съединения

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

INNER JOIN

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

OUTER JOIN

  • Комбинира всеки запис от едната таблица с един или повече записи от другата таблица по зададен критерий
  • Не премахва записите от първата таблица, които не могат да се свържат с нито един запис от втората
  • SELECT[P].[Name]AS[ProducerName],COUNT([B].[BrandID])AS[BrandCount]FROM[Producers]AS[P]LEFTOUTERJOIN[Brands]AS[B]ON ([P].[ProducerID]=[B].[ProducerID])GROUPBY[P].[Name]
slide58

INSERT съждения

  • Създават нови записи в таблица
  • Могат да се комбинират със SELECT съждения за автоматично генериране на данните в новите записи
  • INSERTINTO...(...)VALUES (...)
  • INSERTINTO...(...)SELECT...
  • INSERTINTO[Brands]([ProducerID],[Name])VALUES (5,'Lindt')
  • INSERTINTO[Products]([BrandID],[Name],[EnergyValue])SELECT9,[Name],[Energy]FROM[LegacyProducts]WHERE ([Brand]=N'Lindt')
slide59

UPDATE съждения

  • Променят съдържанието на съществуващи записи
  • По подразбиране променят всички записи в таблицата
  • UPDATE...SET...WHERE...
  • UPDATE[Brands]SET[Description]=N'Швейцарско качество!'WHERE ([Name]=N'Lindt')
  • UPDATE[Products]SET[EnergyValue]=[EnergyValue]*4.184
slide60

DELETE съждения

  • Изтриват записи от таблица
  • По подразбиране изтриват всички записи от таблицата
  • DELETEFROM...WHERE...
  • DELETEFROM[Products]WHERE ([EnergyValue]< 0)
slide61

Трансакции

  • Поредици от операции
  • Изпълняват се цялостно и независимо от всички останали трансакции
  • Гарантиране консистентността на данните
slide62

Характеристики на трансакциите

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

Трансакции в SQL

BEGINTRANSACTION

COMMITTRANSACTION

ROLLBACKTRANSACTION

slide64

ADO.NET

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

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
slide66

Модели за достъп до данните в ADO.NET

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

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
slide68

Основни параметри на connection string

  • Server
  • Database
  • Integrated Security
  • User ID
  • Password
  • Persist Security Info
slide69

Автоматично генериране на

connection string

  • Използва се SqlConnectionStringBuilder
  • Параметрите на връзката са свойства на обекта
slide70

Съхраняване на connection string в

конфигурационен файл

  • Позволява промяна без прекомпилиране на приложението
  • Записва се в секцията <connectionStrings>
  • Достъпва се през ConfigurationManager.ConnectionStrings
  • <configuration> <connectionStrings> <addname="connection"providerName="System.Data.SqlClient"connectionString="Server=(local); Database=HealthyFood; Integrated Security=SSPI" /> </connectionStrings></configuration>
  • connection.ConnectionString =ConfigurationManager.ConnectionStrings["connection"].ConnectionString;
slide71

SqlConnection

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

SqlCommand

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

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"]);}}}

slide74

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"]);}}}
slide75

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"]); } }}
slide76

SQL injection атаки

'); DELETE FROM [Products];--

SELECT[ProductID],[Name]FROM[Products]WHERE ([Name]=N'');DELETEFROM[Products];--')

slide77

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"]); } }}

slide78

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);}
slide79

Трансакции в ADO.NET

  • TransactionScope
  • Complete()
  • IDisposable
  • using (var ts = newTransactionScope())using (var connection = newSqlConnection()){ connection.ConnectionString = ConfigurationManager.ConnectionStrings["connection"].ConnectionString; connection.Open();// операции в трансакция ts.Complete();}
slide80

Императивни езици за програмиране

  • C, C++, C#, Java, Pascal, Visual Basic,…
  • Поредици от инструкции (съждения)
  • Близки до машинния език
slide81

Функционални езици за програмиране

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

Умножение с константа

Императивна версия:

function MulBy2(x){ return x*2;}

slide83

Умножение с константа

Фунцкионална версия:

function MulBy2(x) = x*2;

slide84

Умножение на всички елементи на списък

с константа

Императивна версия:

function MulElementsBy2(list){ result = EmptyList(); foreach (x in list) { AddElement(x*2, result); } return result;}

slide85

Умножение на всички елементи на списък

с константа

Функционална версия:

function MulElementsBy2(list) = Map(MulBy2, list);

slide86

Отсяване на елементи от списък

Императивна версия:

function GetPositiveElements(list){ result = EmptyList(); foreach (x in list) { if (x > 0) { AddElement(x, result); } } return result;}

slide87

Отсяване на елементи от списък

Функционална версия:

function IsPositive(x) = x > 0;function GetPositiveElements(list) = Filter(IsPositive, list);

slide88

Намиране сумата на елементите на списък

Императивна версия:

function Sum(list){ result = 0; foreach (x in list) { result += x; } return result;}

slide89

Намиране сумата на елементите на списък

Функционална версия:

function Add(x, y) = x + y;function Sum(list) = Fold(Add, 0, list);

slide90

Намиране средно аритметично на

елементите на списък

Императивна версия:

function Average(list){ sum = 0; count = 0; foreach (x in list) { sum += x; count++; } return sum/count;}

slide91

Намиране средно аритметично на

елементите на списък

Функционална версия:

function Add1(x, y) = x + 1;function Count(list) = Fold(Add1, 0, list);function Average(list) = Sum(list)/Count(list);

slide92

Разширителни методи на IEnumerable<T>

  • Въведени в .NET Framework 3.5
  • Улесняват прилагането на често използвани операции върху колекции
  • Следват функционалната парадигма
  • System.Linq.Enumerable
slide93

Разширителни методи на IEnumerable<T>

IEnumerable<U> Select<T, U>(thisIEnumerable<T> source, Func<T, U> selector)

IEnumerable<T> Where<T>(thisIEnumerable<T> source, Func<T, bool> predicate)

U Aggregate<T, U>(thisIEnumerable<T> source, U seed, Func<U, T, U> function)

IEnumerable<T> Skip<T>(thisIEnumerable<T> source, int count)

IEnumerable<T> Take<T>(thisIEnumerable<T> source, int count)

slide94

Разширителни методи на IEnumerable<T> -

отложено изпълнение

var numbers = newList<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);}

slide95

Разширителни методи на IEnumerable<T>

  • First, Last, FirstOrDefault, LastOrDefault
  • Sum, Min, Max, Average, Count
  • ToList, ToArray, ToDictionary
slide96

Разширителни методи на IEnumerable<T> -

сортировка

IOrderedEnumerable<T> OrderBy<T, U>(thisIEnumerable<T> source,Func<T, U> keySelector)

IOrderedEnumerable<T> OrderByDescending<T, U>(thisIEnumerable<T> source,Func<T, U> keySelector)

IOrderedEnumerable<T> ThenBy<T, U>(thisIOrderedEnumerable<T> source,Func<T, U> keySelector)

IOrderedEnumerable<T> ThenByDescending<T, U>(thisIOrderedEnumerable<T> source,Func<T, U> keySelector)

slide97

Разширителни методи на IEnumerable<T> -

групиране

IEnumerable<IGrouping<U, T>> GroupBy<T, U>(thisIEnumerable<T> source,Func<T, U> keySelector)

slide98

Разширителни методи на IEnumerable<T> -

съединения

IEnumerable<W> Join<T, U, V, W>(thisIEnumerable<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>(thisIEnumerable<T> first,IEnumerable<U> second,Func<T, V> firstKeySelector,Func<U, V> secondKeySelector,Func<T, IEnumerable<U>, W> resultSelector)

slide99

Language INtegrated Query (LINQ)

  • Също въведен в .NET Framework 3.5
  • Синтаксис подобен на SQL
  • Трансформира се в извиквания на разширителните методи на IEnumerable<T>и IQueryable<T>
  • Няколко различни имплементации
slide100

LINQ - примери

var example1 = from n in numbersselectn*2;

var example1 = numbers.Select(n => n*2);

slide101

LINQ - примери

var example2 = from n in numberswheren > 15orderbyn % 4, n % 7 descendingselectn;

var example2 = numbers .Where(n => n > 15) .OrderBy(n => n % 4) .ThenByDescending(n => n % 7);

slide102

LINQ - примери

var example3 = from n in numbersgroupn by n % 3 into ngwhereng.Count() == 2selectng;

var example3 = numbers .GroupBy(n => n % 3) .Where(ng => ng.Count() == 2);

slide103

LINQ - примери

var example4 = from n in numbersjoinm in numbers on n % 3 equals m % 3selectTuple.Create(n, m);

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

slide104

IQueryable<T>

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

Имплементации на LINQ

  • LINQ to Objects
  • LINQ to XML
  • LINQ to Dataset
  • LINQ to SQL
  • LINQ to Entities
slide106

LINQ to SQL

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

Ръчно описване на ORM модела

  • Прави се с атрибути
  • System.Data.Linq.Mapping
slide108

Ръчно описване на ORM модела - таблици

  • Table
  • Column
  • [Table(Name = "Producers")]publicclassProducer{[Column(IsPrimaryKey = true)]publicint ProducerID { get; set; }[Column(CanBeNull = false)]publicstring Name { get; set; }[Column]publicstring Country { get; set; }}
slide109

Ръчно описване на ORM модела - връзки

  • Association
  • EntitySet<T>, EntityRef<T>
  • [Table(Name = "Producers")]publicclassProducer{privateEntitySet<Brand> _brands;[Column(IsPrimaryKey = true)]publicint ProducerID { get; set; }[Column(CanBeNull = false)]publicstring Name { get; set; }[Column]publicstring Country { get; set; }[Association(Storage = "_brands", OtherKey = "ProducerID")]publicEntitySet<Brand> Brands{get{ return _brands; }set{ _brands.Assign(value); }}}
slide110

Ръчно описване на ORM модела - връзки

[Table(Name = "Brands")]publicclassBrand{privateEntityRef<Producer> _producer;[Column(IsPrimaryKey = true)]publicint BrandID { get; set; }[Column]publicint ProducerID { get; set; }[Column(CanBeNull = false)]publicstring Name { get; set; }[Column]publicstring Description { get; set; }[Association(Storage = "_producer", ThisKey = "ProducerID")]publicProducer Producer{get{ return _producer.Entity; }set{ _producer.Entity = value; }}}

slide111

Ръчно описване на ORM модела - контекст

  • DataContext
  • publicclassHealthyFoodContext : DataContext{publicHealthyFoodContext(string connectionString) : base(connectionString) { }publicTable<Producer> Producers {get{ return GetTable<Producer>(); } }publicTable<Brand> Brands {get{ return GetTable<Brand>(); } }}
  • string connectionString =ConfigurationManager.ConnectionStrings["connection"].ConnectionString;var context = newHealthyFoodContext(connectionString);
slide112

LINQ to SQL заявки - примери

IEnumerable<Brand> brands = from b in context.Brandsselectb;

IEnumerable<Brand> brands = from b in context.Brandswhereb.BrandID > 3selectb;

var brands = from b in context.Brandsselectnew { BrandID = b.BrandID, BrandName = b.Name };

var brands = from b in context.Brandsselectnew { 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);

slide113

Описване на ORM модела с DBML

  • Специализиран XML документ
  • LINQ to SQL Classes файлов шаблон
  • Автоматично генериране на C# код
  • partial класове - добавяне на методи/свойства във външни файлове
slide115

LINQ to SQL – добавяне на записи

Brand brand = context.Brands.Single(b => b.BrandID == 5);var product = newProduct{ Name = "Шоколад Milka алпийско мляко", EnergyValue = 532,};brand.Products.Add(product);

slide116

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;

slide117

LINQ to SQL – изтриване на записи

Product product = context.Products.Single(p => p.ProductID == 19);context.Products.DeleteOnSubmit(product);

slide119

Полезни връзки

  • T-SQL - http://msdn.microsoft.com/en-us/library/ms189826%28v=SQL.90%29.aspx
  • ADO.NET - http://msdn.microsoft.com/en-us/library/e80y5yhx%28v=vs.100%29.aspx
  • LINQ to SQL - http://msdn.microsoft.com/en-us/library/bb386976%28v=vs.100%29.aspx
slide120

Благодаря за вниманието!

  • Въпроси?
  • musashi.bg@gmail.com