240 likes | 376 Views
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
E N D
Platformy technologicznelinq 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 Platformy Technologiczne 2012
Architektura LINQ 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 • … Platformy Technologiczne 2012
Dlaczego LINQ? 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 List<Customer> customers = newList<Customer>(); SqlConnection c = newSqlConnection(ConnectionString); SqlCommandcmd = newSqlCommand( @"SELECT c.Name, c.Phone, c.ID FROMM Customers c WHERE c.City = @po"); cmd.Parameters.AddWithValue("@p0", "USA"); DbDataReaderdr = cmd.ExecuteReader(); while (dr.Read()) { Customercust = newCustomer(); cust.CompanyName = dr.GetString(0); cust.ContactName = dr.GetString(1); cust.Country = dr.GetString(2); cust.CustomerID = dr.GetString(3); } dr.Close(); returncustomers; Platformy Technologiczne 2012
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 wherec.State == "WA" select new { c.Name, c.Phone }; Platformy Technologiczne 2012
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 XQueryz poziomu języka • Rozszerzenia dla jezyków / API Platformy Technologiczne 2012
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 2012
Elementy zapytania Każde zapytanie składa się z 3 niezależnych akcji: • Pobranie źródła danych. • Stworzenie zapytania. • Wykonanie zapytania. classIntroToLINQ { staticvoid Main() { // The Three Parts of a LINQ Query: // 1. Data source. int[] numbers = newint[5] { 0, 1, 2, 3, 4}; // 2. Query creation. // numQuery is an IEnumerable<int> varnumQuery = from num in numbers where (num % 2) == 0 select num; // 3. Query execution. foreach (int num innumQuery) { Console.Write("{0,1} ", num); } } } Platformy Technologiczne 2012
Podstawowe operatory http://aspnetresources.com/downloads/linq_standard_query_operators.pdf Platformy Technologiczne 2012
LINQ to Objects • using System; • using System.Linq; • usingSystem.Collections.Generic; • classapp { • 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 inexpr) • Console.WriteLine(item); • } • } Platformy Technologiczne 2012
LINQ to DataSet • DataSetw pełni zintegrowany z LINQ • Działa dla DataSet typowanego i nietypowanego • Łączenie, grupowanie danych wDataTable • Tworzenie widoków na wieluDataTable 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 2012
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 2012
LINQ to SQL 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 SQL Query DML / Procedura składowana Wiersze SELECT CompanyName FROM Cust WHERE City = 'London' INSERT INTO Customers… UPDATE Customers …DELETE FROM Customers … SQL Server Platformy Technologiczne 2012
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 > 18 select p; foreach (var ppl in query) { Response.Write(ppl.FirstName); } Platformy Technologiczne 2012
LINQ to SQL • Insert • Dodanie obiektów do stworzonego modelu,a następnie wywołanieSubmitChangesna stworzonym obiekcieDataContext. PersonDataContextdbPeople = 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 2012
LINQ to SQL • Update • Pobierany wartość z bazy i edytujemy jej wartość w przypisanym obiekcie. Po dokonaniu zmian wywołujemySubmitChangesna obiekcie typu DataContext. PersonDataContextdbPeople = new PersonDataContext(); var query = from p in dbPeople.Peoples select p; varintAge = 18; foreach (varppl in query) { ppl.Age = intAge; intAge++; } dbPeople.SubmitChanges(); Platformy Technologiczne 2012
LINQ to SQL • Delete • Usuwamy obiekt z kolekcji, następnie wołamy SubmitChangesna obiekcie typu DataContext. PersonDataContextdbPeople = 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 2012
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 2012
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 2012
Hierarchia klas Platformy Technologiczne 2012
Przykład – tworzenie XML <contacts> <contact> <name>Great Food</name> <phone>555-7123</phone> </contact> … </contacts> • 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); XElement contacts = new XElement("contacts", from c in customers wherec.Country == "USA“ select new XElement("contact", new XElement("name", c.CompanyName), new XElement("phone", c.Phone) ) ); Platformy Technologiczne 2012
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 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")); //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 2012
LINQ to XML - wydajność Liczba operacji na sekundę Platformy Technologiczne 2012