platformy technologiczne linq
Post on 06-Feb-2016
54 Views
Preview:
DESCRIPTION
TRANSCRIPT
PLATFORMY TECHNOLOGICZNE
LINQ
mgr inż. Tomasz Gawron
Platformy Technologiczne 2014
2
Czym jest LINQ
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
3
Architektura LINQ
4
Platformy Technologiczne 2014
Providery LINQ
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
5
Dlaczego LINQ?
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;
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;
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
Platformy Technologiczne 2014
6
Dlaczego LINQ?
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
7
Dlaczego LINQ?
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
8
Style zapytania
W LINQ zapytania możemy tworzyć na 2 sposoby SQL – like
W oparciu o metody
IEnumerable<Human> tall = from p in people where p.Height > 200 select p;
IEnumerable<Human> young = people.Where(p => p.Age < 18).Select(p => p);
Platformy Technologiczne 2014
9
Elementy zapytania
Każde zapytanie składa się z 3 niezależnych akcji:
1. Pobranie źródła danych.
2. Stworzenie zapytania.
3. Wykonanie zapytania.
class IntroToLINQ{ static void Main() { // 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
10
Podstawowe operatory
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 kluczehttp://aspnetresources.com/downloads/
linq_standard_query_operators.pdf
Platformy Technologiczne 2014
11
LINQ to Objects
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
12
LINQ to DataSet
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
13
LINQ to SQL
Zapewnia mapowanie obiektowo - relacyjne (ORM) z .NET Framework dla baz Microsoft SQL Server
Użycie silnie typowanych danych Zintegrowany dostęp do danych
Mapowanie tabel i wierszy na klasy i obiekty Zbudowane na ADO.NET
Mapowanie Poprzez atrybuty lub zewnętrznie Ręcznie lub poprzez designer Relacje mapują się na properties
Persistence Sledzenie zmian Aktualizacja poprzez SQL
Platformy Technologiczne 2014
14
LINQ to SQL
SQL Server
LINQ to SQL
from c in db.Customerswhere c.City == "London"select c.CompanyName
LINQ Query
SQL Query
SELECT CompanyNameFROM CustWHERE City = 'London'
Wiersze
Obiekty
SubmitChanges()
DML / Procedura składowana
db.Customers.Add(c1);c2.City = “Seattle";db.Customers.Remove(c3);
INSERT INTO Customers…UPDATE Customers …DELETE FROM Customers …
Aplikacja
Platformy Technologiczne 2014
15
LINQ to SQL
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 > 18select p;
foreach (var ppl in query){
Response.Write(ppl.FirstName);}
Platformy Technologiczne 2014
16
LINQ to SQL
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
17
LINQ to SQL
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
18
LINQ to SQL
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 == 1select p;
if (query.Count() > 0) {
dbPeople.Peoples.DeleteOnSubmit(query.First());dbPeople.SubmitChanges();
}
Platformy Technologiczne 2014
19
LINQ to XML
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
20
LINQ to XML
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
21
Hierarchia klas
Platformy Technologiczne 2014
22
Przykład – tworzenie XML
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");
name.InnerText = c.CompanyName;
e.AppendChild(name);
XmlElement phone = doc.CreateElement("phone");
phone.InnerText = c.Phone;
e.AppendChild(phone);
contacts.AppendChild(e);
}
doc.AppendChild(contacts);
<contacts> <contact> <name>Great Food</name> <phone>555-7123</phone> </contact> …
</contacts>
XElement contacts = new XElement("contacts",
from c in customers
where c.Country == "USA“
select new XElement("contact",
new XElement("name", c.CompanyName),
new XElement("phone", c.Phone)
)
);
Platformy Technologiczne 2014
23
Przykład – przeszukiwanie XML<?xml version="1.0"
encoding="utf-8"?>
<people>
<person age="15">
<firstname>AAA</firstname>
<lastname>XXX</lastname>
</person>
<person age="17">
<firstname>ABB</firstname>
<lastname>YYY</lastname>
</person>
<person age="24">
<firstname>CCC</firstname>
<lastname>ZZZ</lastname>
</person>
</people>
//Using LINQ Extension Methods against an XML FileXDocument people = XDocument.Load(@"C:\LINQToXML.xml");
//Casting to XelementIEnumerable<XElement> xmlResult;xmlResult = people.Descendants("person") .Where(p => p.Element("firstname").Value.StartsWith("A"));
//Total count of records.txtResultCount.Text = xmlResult.Count().ToString();
//Person First Name.txtPersonFirstName.Text = xmlResult.First().FirstNode;
//Person Last Name.txtPersonLastName.text = xmlResult.First().LastNode;
Platformy Technologiczne 2014
24
LINQ to XML - wydajność
Liczba operacji na sekundę
Platformy Technologiczne 2014
25
Parallel LINQ
Umożliwia równoległe wykonywanie zapytania
Zapytanie najpierw podlega analizie Wyniki muszą być scalone w pętli foreach
top related