25
PLATFORMY TECHNOLOGICZNE LINQ mgr inż. Tomasz Gawron

Platformy technologiczne linq

  • Upload
    quinta

  • View
    45

  • Download
    0

Embed Size (px)

DESCRIPTION

Platformy technologiczne linq. mgr inż. Tomasz Gawron. 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 - PowerPoint PPT Presentation

Citation preview

Page 1: Platformy technologiczne linq

PLATFORMY TECHNOLOGICZNE

LINQ

mgr inż. Tomasz Gawron

Page 2: Platformy technologiczne linq

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

Page 3: Platformy technologiczne linq

Platformy Technologiczne 2014

3

Architektura LINQ

Page 4: Platformy technologiczne 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 …

Page 5: Platformy technologiczne linq

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

Page 6: Platformy technologiczne linq

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

Page 7: Platformy technologiczne linq

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

Page 8: Platformy technologiczne linq

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

Page 9: Platformy technologiczne linq

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

Page 10: Platformy technologiczne linq

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

Page 11: Platformy technologiczne linq

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

Page 12: Platformy technologiczne linq

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

Page 13: Platformy technologiczne linq

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

Page 14: Platformy technologiczne linq

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

Page 15: Platformy technologiczne linq

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

Page 16: Platformy technologiczne linq

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();

Page 17: Platformy technologiczne linq

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();

Page 18: Platformy technologiczne linq

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();

}

Page 19: Platformy technologiczne linq

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

Page 20: Platformy technologiczne linq

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

Page 21: Platformy technologiczne linq

Platformy Technologiczne 2014

21

Hierarchia klas

Page 22: Platformy technologiczne linq

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)

)

);

Page 23: Platformy technologiczne linq

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;

Page 24: Platformy technologiczne linq

Platformy Technologiczne 2014

24

LINQ to XML - wydajność

Liczba operacji na sekundę

Page 25: Platformy technologiczne linq

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