Platformy technologiczne linq

Post on 06-Feb-2016

45 views 0 download

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

Transcript of Platformy technologiczne linq

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