Platformy technologiczne linq
Download
Report
Transcript Platformy technologiczne linq
PLATFORMY
TECHNOLOGICZNE
LINQ
mgr inż. Tomasz Gawron
Czym jest LINQ
2
Wprowadzony w .NET 3
Daje możliwość unifikacji dostępu do różnego typu danych
Uproszczone odpytywanie obiektów, daych i XML poprzez
integrację zapytań z językiem programownia
Umożliwia odpytywanie kolekcji implementujących
IEnumerable<>, przykładowo tablicy, listy, XML DOM, tabel
dazy danych
Wprowadza zbliżoną do SQL składnię niezależną od
źródła danych
Oferuje sprawdzanie typów oraz dynamiczne tworzenie
zapytań.
Namespace System.Linq
Platformy Technologiczne 2014
Architektura LINQ
3
Platformy Technologiczne 2014
Providery LINQ
4
Microsoft:
LINQ to Objects
LINQ to SQL
LINQ to XML
LINQ to DataSet
LINQ to Entities
(EntityFramework)
ParallelLINQ
Dostawcy zewnętrzni:
LINQ to Amazon
LINQ to NHibernate
LINQ to Active
Directory
LINQ to Google
LINQ to MySQL
LINQ to Excel
LINQ to Sharepoint
…
Platformy Technologiczne 2014
Dlaczego LINQ?
5
List<Customer> customers = new List<Customer>();
SqlConnection c = new SqlConnection(ConnectionString);
SqlCommand cmd = new SqlCommand(
@"SELECT c.Name, c.Phone, c.ID
FROMM Customers c
WHERE c.City = @po");
cmd.Parameters.AddWithValue("@p0", "USA");
DbDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
Customer cust = new Customer();
cust.CompanyName = dr.GetString(0);
cust.ContactName = dr.GetString(1);
cust.Country = dr.GetString(2);
cust.CustomerID = dr.GetString(3);
}
dr.Close();
return customers;
Platformy Technologiczne 2014
Błędy:
Błąd składniowy w SQL –
“FROMM”
Niepoprawna nazwa parametru –
“@po” vs. “@p0” (o vs. 0)
Polecenie nie połączone z
połączeniem
Połącznie nie otworzone
Połączenie nie zamknięte
Elementy nie dodane do listy
wynikowej
Pobieramy większą liczbę niż
zwraca select
Dlaczego LINQ?
6
class Contact { … };
List<Contact> contacts = new List<Contacts>();
foreach(Customer c in customers)
{
if(c.State == “WA”)
{
Contact ct = new Contact();
ct.Name = c.Name;
ct.Phone = c.Phone;
contacts.Add(ct);
}
}
var contacts =
from c in customers
where c.State == "WA"
select new { c.Name, c.Phone };
Platformy Technologiczne 2014
Dlaczego LINQ?
7
Zunifikowany dostęp do obiektów, obiektów
relacyjnych, XML
Sprawdzanie typów oraz wspacie IntelliSense
Dostęp do funkcjonalności podobnych do SQL oraz
XQuery z poziomu języka
Rozszerzenia dla jezyków / API
Platformy Technologiczne 2014
Style zapytania
8
W LINQ zapytania możemy tworzyć na 2 sposoby
SQL
– like
IEnumerable<Human> tall = from p in people where p.Height > 200 select p;
W
oparciu o metody
IEnumerable<Human> young = people.Where(p => p.Age < 18).Select(p => p);
Platformy Technologiczne 2014
Elementy zapytania
9
Każde zapytanie składa się z 3 niezależnych akcji:
1.
Pobranie źródła danych.
class IntroToLINQ
2.
Stworzenie zapytania.
{
static void Main()
3.
Wykonanie zapytania.
{
// The Three Parts
of a LINQ Query:
// 1. Data source.
int[] numbers = new int[5] { 0, 1, 2, 3, 4};
// 2. Query creation.
// numQuery is an IEnumerable<int>
var numQuery =
from num in numbers
where (num % 2) == 0
select num;
// 3. Query execution.
foreach (int num in numQuery)
{
Console.Write("{0,1} ", num);
}
}
}
Platformy Technologiczne 2014
Podstawowe operatory
10
Operator
Działanie
Where
Zwraca elementy, dla których warunek zwraca „true”
Select
Dla każdego elementu w kolekcji zwraca wartość przekazaną w operatorze
First
Zwraca pierwszy element kolekcji
Last
Zwraca ostatni element kolekcji
Single
Zwraca pojedynczy element kolekcji
OrderBy
Sortuje kolekcję wynikową zgodnie z zadanym predykatem
Distinct
Usuwa z kolekcji wynikowej duplikaty
Count
Zwraca ilość rekordów w kolekcji wynikowej
Average
Zwraca średnią wartość dla pola kolekcji wynikowej
Join
Pozwala na złączenie dwóch kolekcji w oparciu o przekazane klucze
http://aspnetresources.com/downloads/linq_standard_query_operators.pdf
Platformy Technologiczne 2014
LINQ to Objects
11
using System;
using System.Linq;
using System.Collections.Generic;
class app {
static void Main() {
string[] names = {
"Burke", "Connor",
"Frank", "Everett",
"Albert”, "George",
"Harris", "David" };
Func<string, bool> filter = s => s.Length == 5;
Func<string, string> extract = s => s;
Func<string, string> project = s => s.ToUpper();
IEnumerable<string> expr = names
.Where(filter).OrderBy(extract)
.Select(project);
foreach (string item in expr)
Console.WriteLine(item);
}
}
Platformy Technologiczne 2014
LINQ to DataSet
12
DataSet w pełni zintegrowany z LINQ
Działa dla DataSet typowanego i nietypowanego
Łączenie, grupowanie danych w DataTable
Tworzenie widoków na wielu DataTable
DataSet ds = new DataSet();
FillTheDataSet(ds);
DataTable dtPeople = ds.Tables["People"];
IEnumerable<DataRow> query =
from people In dtPeople.AsEnumerable()
select people;
foreach (DataRow p in query)
Response.Write(p.Field<string>(“FirstName"));
Platformy Technologiczne 2014
LINQ to SQL
13
Zapewnia mapowanie obiektowo - relacyjne (ORM) z .NET
Framework dla baz Microsoft SQL Server
Użycie silnie typowanych danych
Zintegrowany dostęp do danych
Mapowanie
Mapowanie tabel i wierszy na klasy i obiekty
Zbudowane na ADO.NET
Poprzez atrybuty lub zewnętrznie
Ręcznie lub poprzez designer
Relacje mapują się na properties
Persistence
Sledzenie zmian
Aktualizacja poprzez SQL
Platformy Technologiczne 2014
LINQ to SQL
14
Aplikacja
from c in db.Customers
where c.City == "London"
select c.CompanyName
db.Customers.Add(c1);
c2.City = “Seattle";
db.Customers.Remove(c3);
Obiekty
LINQ Query
SubmitChanges()
LINQ to SQL
DML / Procedura składowana
SQL Query
Wiersze
SELECT CompanyName
FROM Cust
WHERE City = 'London'
INSERT INTO Customers…
UPDATE Customers …
DELETE FROM Customers …
SQL Server
Platformy Technologiczne 2014
LINQ to SQL
15
Select
Pobieranie wierszy jest osiągane poprzez pisanie zapytania w dowolnym języku oraz jego
wykonanie. Za translację na zapytanie SQL odpowiedzialna jest warstwa LINQ to SQL
PersonDataClassesDataContext dbPeople = new
PersonDataClassesDataContext();
var query = from p in dbPeople.Peoples
where p.Age > 18
select p;
foreach (var ppl in query)
{
Response.Write(ppl.FirstName);
}
Platformy Technologiczne 2014
LINQ to SQL
16
Insert
Dodanie obiektów do stworzonego modelu,a następnie wywołanie SubmitChanges na
stworzonym obiekcie DataContext.
PersonDataContext dbPeople = new PersonDataContext();
People p = new People() {FirstName = "Gyan", LastName = "Singh", Age = 33};
dbPeople.Peoples.InsertOnSubmit(p);
// At this point, the new People object is added in the object model.
// In LINQ to SQL, the change is not sent to the database until SubmitChanges is called.
dbPeople.SubmitChanges();
Platformy Technologiczne 2014
LINQ to SQL
17
Update
Pobierany wartość z bazy i edytujemy jej wartość w przypisanym obiekcie. Po dokonaniu
zmian wywołujemy SubmitChanges na obiekcie typu DataContext.
PersonDataContext dbPeople = new PersonDataContext();
var query = from p in dbPeople.Peoples
select p;
var intAge = 18;
foreach (var ppl in query)
{
ppl.Age = intAge;
intAge++;
}
dbPeople.SubmitChanges();
Platformy Technologiczne 2014
LINQ to SQL
18
Delete
Usuwamy obiekt z kolekcji, następnie wołamy SubmitChanges na obiekcie typu
DataContext.
PersonDataContext dbPeople = new PersonDataContext();
var query = from p in dbPeople.Peoples
where p.PersonID == 1
select p;
if (query.Count() > 0)
{
dbPeople.Peoples.DeleteOnSubmit(query.First());
dbPeople.SubmitChanges();
}
Platformy Technologiczne 2014
LINQ to XML
19
Stworzony by umożliwić korzystanie z XML bez
konieczności poznawania Xpath/XSLT
Umożliwia przetwarzanie w pamięci dokumentu XML w
celu pobrania kolekcji elementów i atrybutów
Tworzenie zapytań z wieloma źródłami danych
Możliwość użycia wyników jako parametrów dla
Xelement lub Xattribute
Tworzenie drzew XML
Wydajniejszy niż XPath
Łatwiejszy i bogatszy niż niskopoziomowe sposoby
Platformy Technologiczne 2014
LINQ to XML
20
Podstawowe klasy (System.Xml.Linq)
XElement
– reprezentuje węzeł w strukturze DOM, dokument XML
składa się z drzewa XElement
XAttribute
– reprezentuje atrybuty XML
XNamespace – reprezentuje namespace XML
XName
XDocument – reprezentuje kompletny dokument XML
Platformy Technologiczne 2014
Hierarchia klas
21
Platformy Technologiczne 2014
Przykład – tworzenie XML
22
TodayXmlDocument doc = new XmlDocument();
XmlElement contacts = doc.CreateElement("contacts");
foreach (Customer c in customers)
if (c.Country == "USA") {
XmlElement e = doc.CreateElement("contact");
XmlElement name = doc.CreateElement("name");
<contacts>
<contact>
<name>Great Food</name>
<phone>555-7123</phone>
</contact>
…
</contacts>
name.InnerText = c.CompanyName;
e.AppendChild(name);
XmlElement phone = doc.CreateElement("phone");
phone.InnerText = c.Phone;
e.AppendChild(phone);
XElement contacts = new XElement("contacts",
contacts.AppendChild(e);
from c in customers
}
where c.Country == "USA“
doc.AppendChild(contacts);
select new XElement("contact",
new XElement("name", c.CompanyName),
new XElement("phone", c.Phone)
)
);
Platformy Technologiczne 2014
Przykład – przeszukiwanie XML
23
<?xml version="1.0" encoding="utf-8"?>
<people>
<person age="15">
<firstname>AAA</firstname>
<lastname>XXX</lastname>
</person>
<person age="17">
//Using LINQ Extension Methods against an XML File
XDocument people = XDocument.Load(@"C:\LINQToXML.xml");
//Casting to Xelement
IEnumerable<XElement> xmlResult;
xmlResult = people.Descendants("person")
.Where(p => p.Element("firstname").Value.StartsWith("A"));
<firstname>ABB</firstname>
<lastname>YYY</lastname>
</person>
<person age="24">
<firstname>CCC</firstname>
//Total count of records.
txtResultCount.Text = xmlResult.Count().ToString();
//Person First Name.
txtPersonFirstName.Text = xmlResult.First().FirstNode;
<lastname>ZZZ</lastname>
</person>
</people>
//Person Last Name.
txtPersonLastName.text = xmlResult.First().LastNode;
Platformy Technologiczne 2014
LINQ to XML - wydajność
24
Liczba operacji na sekundę
Platformy Technologiczne 2014
Parallel LINQ
25
Umożliwia równoległe wykonywanie zapytania
Zapytanie najpierw podlega analizie
Wyniki muszą być scalone w pętli foreach
Platformy Technologiczne 2014