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 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 2 Platformy Technologiczne 2012
Architektura LINQ 3 Platformy Technologiczne 2012
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 … 4 Platformy Technologiczne 2012
Dlaczego LINQ? Platformy Technologiczne List customers = new List (); SqlConnection c = new SqlConnection(ConnectionString); SqlCommand cmd = new c.Name, c.Phone, c.ID FROMM Customers c WHERE c.City "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 customers = new List (); SqlConnection c = new SqlConnection(ConnectionString); SqlCommand cmd = new c.Name, c.Phone, c.ID FROMM Customers c WHERE c.City "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 (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? Platformy Technologiczne class Contact { … }; List contacts = new List (); 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 };
Dlaczego LINQ? Platformy Technologiczne 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
Style zapytania Platformy Technologiczne W LINQ zapytania możemy tworzyć na 2 sposoby SQL – like W oparciu o metody IEnumerable tall = from p in people where p.Height > 200 select p; IEnumerable young = people.Where(p => p.Age p);
Elementy zapytania Platformy Technologiczne 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 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); }
Podstawowe operatory Platformy Technologiczne OperatorDziałanie WhereZwraca elementy, dla których warunek zwraca true SelectDla każdego elementu w kolekcji zwraca wartość przekazaną w operatorze FirstZwraca pierwszy element kolekcji LastZwraca ostatni element kolekcji SingleZwraca pojedynczy element kolekcji OrderBySortuje kolekcję wynikową zgodnie z zadanym predykatem DistinctUsuwa z kolekcji wynikowej duplikaty CountZwraca ilość rekordów w kolekcji wynikowej AverageZwraca średnią wartość dla pola kolekcji wynikowej JoinPozwala na złączenie dwóch kolekcji w oparciu o przekazane klucze
LINQ to Objects Platformy Technologiczne 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 filter = s => s.Length == 5; Func extract = s => s; Func project = s => s.ToUpper(); IEnumerable expr = names.Where(filter).OrderBy(extract).Select(project); foreach (string item in expr) Console.WriteLine(item); }
LINQ to DataSet Platformy Technologiczne 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 query = from people In dtPeople.AsEnumerable() select people; foreach (DataRow p in query) Response.Write(p.Field (FirstName"));
LINQ to SQL Platformy Technologiczne 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
LINQ to SQL Platformy Technologiczne SQL Server LINQ to SQL from c in db.Customers where c.City == "London" select c.CompanyName LINQ Query SQL Query SELECT CompanyName FROM Cust WHERE 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
LINQ to SQL Platformy Technologiczne 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); }
LINQ to SQL Platformy Technologiczne 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();
LINQ to SQL Platformy Technologiczne 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();
LINQ to SQL Platformy Technologiczne 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(); }
LINQ to XML Platformy Technologiczne 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
LINQ to XML Platformy Technologiczne 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
Hierarchia klas Platformy Technologiczne
Przykład – tworzenie XML Platformy Technologiczne 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); Great Food … 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) ) );
Przykład – przeszukiwanie XML Platformy Technologiczne AAA XXX ABB YYY CCC ZZZ //Using LINQ Extension Methods against an XML File XDocument people = //Casting to Xelement IEnumerable 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;
LINQ to XML - wydajność Platformy Technologiczne Liczba operacji na sekundę
Parallel LINQ Platformy Technologiczne Umożliwia równoległe wykonywanie zapytania Zapytanie najpierw podlega analizie Wyniki muszą być scalone w pętli foreach