1 / 25

LINQ - Language Integrated Query

LINQ - Language Integrated Query. Unifikacja dostępu do 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 , list y , XML DOM, tabel dazy danych

portia
Download Presentation

LINQ - Language Integrated Query

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. LINQ - Language Integrated Query • Unifikacja dostępu do danych • Uproszczone odpytywanie obiektów, daych i XML poprzez integrację zapytań z językiem programownia • Umożliwia odpytywanie kolekcji implementującychIEnumerable<>,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ń. • LINQ namespaces: • System.Core.dll • System.Linq - operatory, System.Linq.Expressions • System.Data.Linq.dll • System.Data.Linq - LINQ to SQL, System.Data.Linq.Mapping, System.Data.Linq.SqlClient • System.Data.DataSetExtensions.dll • System.Data - LINQ to DataSet • System.Xml.Linq.dll • System.Xml.Linq - LINQ to XML

  2. Architektura LINQ Visual C# Visual Basic Others .Net Language Integrated Query (LINQ) LINQ-enabled data sources LINQ-enabled ADO.NET LINQ To Datasets LINQ To SQL LINQ To Entities LINQ To XML LINQ To Objects <book> <title/> <author/> <price/> </book> Databases Objects XML

  3. LINQ Data Providers • Microsoft: • LINQ to Objects • LINQ to SQL • LINQ to XML • LINQ to DataSet • LINQ to Entities(EntityFramework) • ParallelLINQ Zewnętrzne: • LINQ to Amazon • LINQ to NHibernate • LINQ to Active Directory • LINQ to Google • LINQ to MySQL • LINQ to Excel • LINQ to Sharepoint • LINQ to JavaScript • LINQ to CRM • LINQ to Geo • LINQExtender • DBLINQ Linq provider for MySQL, Oracle, SQL Server, PostgreSQL, SQLite, Ingres and Firebird

  4. ADO a relacyjne dane 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(); 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

  5. LINQ – składowe zapytania Każde zapytanie składa się z 3 niezależnych akcji: • Pobranie źródła danych. • Stworzenie zapytania. • Wykonanie zapytania. class IntroToLINQ { 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> 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); } } }

  6. LINQ – styl programowania 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 };

  7. Zapytania • Składnia zbliżona do SQL • Kompilowane do C# (dzięki Extension Methods) Zaczyna sięfrom Zero lub więcej from, join, let, where, orderby fromidinsource { fromidinsource | joinidinsourceonexprequalsexpr [ intoid ] | letid = expr | wherecondition | orderbyordering, ordering, … } selectexpr | groupexprbykey [ intoidquery ] Kończy się selectlubgroupby Opcjonalnieinto

  8. Zapytania • Transformacja w wykonanie metody • Where, Join, OrderBy, Select, GroupBy, … from c in customers where c.State == "WA" select new { c.Name, c.Phone }; customers .Where(c => c.State == "WA") .Select(c => new { c.Name, c.Phone });

  9. LINQ to Objects • using System; • using System.Linq; • using System.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 in expr) • Console.WriteLine(item); • } • } • Operatory mogą być użyte z każdą kolekcją(IEnumerable<T>) • Select, Where, GroupBy, Join, etc. • Odroczona walidacja zapytania • Wyrażenia Lambda BURKE DAVID FRANK

  10. LINQ To In-Memory Objects LINQ To In-Memory Objectsjest używane do tworzenia zapytań do obiektów w każdym języku platformy .NET poprzez LINQ. Przykład: public class Person { public string FirstName { get; set; } public string LastName { get; set; } public int Age { get; set; } } //Create a list of person System.Collections.Generic.List<Person> lstPerson = new System.Collections.Generic.List<Person> { new Person { FirstName = "A", LastName = "X", Age = 15 }, new Person { FirstName = "B", LastName = "Y", Age = 17 }, new Person { FirstName = "C", LastName = "Z", Age = 24 } };

  11. LINQ To In-Memory Objects - przykład Użycie metody rozszerzającej Where() pozwala na pobranie kolecji odpowiadającej zapytaniu. IEnumerable<Person> queryResult; queryResult= lstPerson.Where(p => p.FirstName.StartsWith("A")); Response.Write(queryResult.Count().ToString()); //Total result count Response.Write(queryResult.First().FirstName); //Display First Name Response.Write(queryResult.First().LastName); //Display Last Name //Compute average age of person in list and display. Response.Write(person.Average(p => p.Age).ToString()); //Compute max age of person in list and display. Response.Write(person.Max(p => p.Age).ToString());

  12. 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 Przykład: // Query Expression Syntax DataSet ds = new DataSet(); FillTheDataSet(ds); //Fill the DataSet. 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"));

  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

  14. LINQ to SQL Application from c in db.Customers where c.City == "London" select c.CompanyName db.Customers.Add(c1); c2.City = “Seattle"; db.Customers.Remove(c3); LINQ Query Objects SubmitChanges() LINQ to SQL SQL Query Rows DML or Stored Procedures SELECT CompanyName FROM Cust WHERE City = 'London' INSERT INTO Customers… UPDATE Customers …DELETE FROM Customers … SQL Server

  15. LINQ approach // First we will declare instance of DataContext class. // It is responsible for the translation of LINQ to SQL, and // the mapping of the results (rows) of that query to objects. // The DataContext can be equated to a database, in that it contains a series of tables // and stored procedures and views. CustomersDataContext dbCust = new CustomersDataContext(); var query = from p in dbCust.Customers where p.City == “paris” select p.Name, p.Country; foreach (var cust in query) { Response.Write(cust.Name); Response.Write(cust.Country); }

  16. LINQ To SQL - select 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 Przykład: 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); }

  17. LINQ To SQL - insert Insert:Dodanie obiektów do stworzonego modelu,a następnie wywołanieSubmitChangesna stworzonym obiekcieDataContext. PersonDataClassesDataContext dbPeople = new PersonDataClassesDataContext(); People objPeople = new People(); objPeople.FirstName = "Gyan"; objPeople.LastName = "Singh"; objPeople.Age = 33; dbPeople.Peoples.InsertOnSubmit(objPeople); // 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();

  18. LINQ To SQL - update Update Query: Pobierany wartość z bazy i edytujemy jej wartość w przypisanym obiekcie. Po dokonaniu zmian wywołujemySubmitChangesna obiekcie typu DataContext. Pryzkad: PersonDataClassesDataContext dbPeople = new PersonDataClassesDataContext(); var query = from p in dbPeople.Peoples select p; var intAge = 18; foreach (var ppl in query){ ppl.Age = intAge; intAge++; } dbPeople.SubmitChanges();

  19. LINQ To SQL - delete Delete Query:Usuwamy obiekt z kolekcji, następnie wołamy SubmitChangesna obiekcie typu DataContext. Przykład: PersonDataClassesDataContext dbPeople = new PersonDataClassesDataContext(); var query = from p in dbPeople.Peoples where p.PersonID == 1 select p; if (query.Count() > 0){ dbPeople.Peoples.DeleteOnSubmit(query.First()); dbPeople.SubmitChanges(); }

  20. LINQ to XML - System.Xml.Linq • Stworzony by umożliwić korzystanie z XML bez konieczności poznawania Xpath/XSLT • Stworzony na bazie standardowych zapytań LINQ • 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 • Bardziej wydajne (mniejsze zużycie pamięci) • Łatwiejszy i bogatszy niż niskopoziomowe sposoby

  21. LINQ to XML Class Hierarchy

  22. LINQ to XML - przykład • 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> LINQ to XML 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) ) );

  23. LINQ To XML - przykład <?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>

  24. LINQ To XML – przykład //Using LINQ Extension Methods against an XML File XDocument people = XDocument.Load(@"C:\LINQToXML.xml"); //Casting to XElement System.Collections.Generic.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; txtAvgAge.Text = people.Descendants("person").Average(p => Convert.ToInt32(p.Attribute("age").Value));

  25. Korzyści z LINQ • Zunifikowany dostęp do obiektów, obiektów relacyjnych, XML • Sprawdzanie typów oraz wspacie IntelliSense • Dostęp do funkcjonalności podobnych doSQL oraz Xquery z poziomu języka • Rozszerzenia dla jezyków / API

More Related