1 / 53

Language Integrated Query

Language Integrated Query. Adam Furmanek adam.furmanek@studentpartner.pl. Agenda. Nowy semestr Co to jest LINQ Delegaty Wyrażenia lambda Extension methods LINQ to SQL, LINQ to EF, LINQ to XML PLINQ Podsumowanie. Microsoft Student Partners.

will
Télécharger la présentation

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. Language Integrated Query Adam Furmanekadam.furmanek@studentpartner.pl

  2. Agenda Nowy semestr Co to jest LINQ Delegaty Wyrażenia lambda Extension methods LINQ to SQL, LINQ to EF, LINQ to XML PLINQ Podsumowanie

  3. Microsoft Student Partners Ogólnoświatowy program zrzeszający grupy .NET i IT Setki uczelni Tysiące członków

  4. Historia programu 2001 – wtedy wszystko się zaczęło W ciągu 5 lat program działał w piętnastu krajach W końcu 2006 roku został rozszerzony na 50 państw Obecnie istnieje w ponad 100 krajach i ma niemal 3000 członków

  5. Hierarchia Ogólnoświatowym szefem programu jest Michelle Fleming APM w Polsce SC dla Małopolski SP AGH WY!!!

  6. Działalność grupy Spotkania Szkolenia Certyfikaty Staże i praktyki IT Academic Day ImagineCup CodeCamp Noc z technologią

  7. Co to jest LINQ? LINQ - .NET Language-Integrated Query Zestaw deklaratywnych zapytań ogólnego przeznaczenia, służących do dostępu do różnych źródeł danych z aplikacji obiektowych.

  8. Co to jest LINQ? Technologia LINQ jest dostępna na platformie Microsoft .Net Framework od wersji 3.5 Aktualnie dostępna dla języków C# i Visual Basic.Net Dostępne porty dla Javy, PHP i JavaScriptu Wpływ na powstanie miał SQL i Haskell

  9. Co to jest LINQ? • LINQ to zbiór operatorów zapytań (ang. standard query operators) umożliwiających m.in.: • przeglądanie danych • filtrowanie/selekcje danych • projekcje danych • LINQ udostępnia przyjazną, skrótową metodę zapisu operatorów zapytań

  10. Projekt LINQ Język: C# Język: VB Inne języki… .Net Language Integrated Query (LINQ) Źródła danych LINQ LINQ To Objects LINQ To DataSets LINQ To SQL LINQ To Entities LINQ To XML Inne…

  11. Delegaty Można je sobie wyobrażać jako wskaźniki na funkcje privatedelegateintDo (charx); Mogą zawierać kilka metod Jeżeli nie są void – zwracają wynik ostatniej funkcji Dotransform; transform += method1; transform += method2; transform('5');

  12. Wbudowane delegaty Action: publicdelegatevoidAction<T>(T obj); Opcjonalnie przyjmuje parametr, nic nie zwraca Func: publicdelegateTResultFunc<TResult>(); Opcjonalnie przyjmuje parametr i zwraca

  13. Wyrażenia lambda Nienazwana metoda zapisana w miejscu delegata (parameters) => expression-or-statement-block Można pominąć nawiasy, gdy jeden parametr transform += (c) => (int) c;

  14. Closures Wyrażenie lambda może „przechwycić” lokalne zmienne Wartości są obliczane dopiero przy wykonywaniu wyrażenia intfactor = 2; Func<int, int> multiplier = n => n * factor; factor = 10; Console.WriteLine(multiplier(3)); // 30

  15. Closures Przechwycone zmienne w pętli zachowuję się tak, jakby były deklarowane poza pętlą Action[] actions = newAction[3]; for (int i = 0; i < 3; i++) actions[i] = () => Console.Write(i); foreach (Action a in actions) a(); // 333

  16. Closures Dlaczego tak jest? Action[] actions = newAction[3]; int i = 0; actions[0] = () => Console.Write(i); i = 1; actions[1] = () => Console.Write(i); i = 2; actions[2] = () => Console.Write(i); i = 3; foreach (Action a in actions) a(); // 333

  17. Closures Jak sobie z tym poradzić? Skopiować zmienną. Action[] actions = newAction[3]; for (int i = 0; i < 3; i++) { intloopScopedi = i; actions[i] = () => Console.Write(loopScopedi); } foreach (Action a in actions) a(); // 012

  18. Closures Wyrażenie lambda może zmieniać przechwycone zmienne intseed = 0; Func<int> natural = () => seed++; Console.WriteLine(natural()); // 0 Console.WriteLine(natural()); // 1 Console.WriteLine(seed); // 2

  19. Closures Przechwycone zmienne żyją tak długo, jak długo żyje wyrażenie staticFunc<int> Natural() { intseed = 0; return() => seed++; // Returns a closure } staticvoidMain() { Func<int> natural = Natural(); Console.WriteLine(natural()); // 0 Console.WriteLine(natural()); // 1 }

  20. Extension methods namespaceExtensionMethods { publicstaticclassMyExtensions{ publicstaticintWordCount(this String str) { returnstr.Split(newchar[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length; } } } Służą do rozszerzania innych klas Są zawsze statyczne W pierwszym parametrze przyjmują klasę do rozszerzenia

  21. Wbudowane extensionmethods publicstaticbool Contains<TSource>(thisIEnumerable<TSource> source,TSourcevalue);publicstaticTSource First<TSource>(thisIEnumerable<TSource> source); publicstaticint Max(thisIEnumerable<int> source); publicstaticint Sum(thisIEnumerable<int> source); publicstaticIEnumerable<TResult> Select<TSource, TResult>(thisIEnumerable<TSource> source, Func<TSource, int, TResult> selector); publicstaticIEnumerable<TSource> Where<TSource>(thisIEnumerable<TSource> source, Func<TSource, bool> predicate);

  22. Co nam to daje? string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" }; IEnumerable<string> longerThanFour = names.Where(s => s.Length > 4); foreach(string s inlongerThanFour) { Console.WriteLine(s); }

  23. Co nam to daje? string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay"}; IEnumerable<string> query = names .Where(n => n.Contains("a")) .OrderBy(n => n.Length) .Select(n => n.ToUpper()); foreach (string name in query) Console.WriteLine(name); JAY MARY HARRY

  24. Jak to działa?

  25. LINQ to Objects Operują na danych lokalnych Składnią przypominają SQL string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" }; IEnumerable<string> query = fromn innames wheren.Contains("a") // Filterelements orderbyn.Length// Sort elements selectn.ToUpper(); // Translate each element (project) foreach (string name in query) Console.WriteLine(name);

  26. LINQ to Objects n jest tak zwaną range-variable Wyrażenie LINQ jest kompilowane do extensionmethods DeferredExecution - Wyrażenie jest wykonywane dopiero w momencie wykorzystania wyniku – wyjątkiem są wyrażenia zwracające coś innego od IEnumerable<>

  27. Jak działa DeferredExecution

  28. Mieszanie składni string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" }; int matches = (fromn in names wheren.Contains("a") selectn).Count(); // 3

  29. var Czasami może być trudno określić typ zwracany przez funkcję Albo po prostu jesteśmy leniwi i nie chce się nam określać typu Z pomocą przychodzi var var a = 3;

  30. Typy anonimowe classTempProjectionItem { publicstring Original; // Original name publicstringVowelless; // Vowel-stripped name } string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" }; IEnumerable<TempProjectionItem> temp = fromn innames selectnewTempProjectionItem { Original= n, Vowelless= n.Replace("a", "").Replace("e","").Replace("i", "") .Replace("o", "") .Replace("u", "") };

  31. Typy anonimowe var query = from n in names selectnew { Original= n, Vowelless= n.Replace ("a", "").Replace ("e", "").Replace ("i", "") .Replace ("o", "") .Replace ("u", "") };

  32. LINQ to SQL [Table(Name=”Customers”)] publicclassCustomer { [Column(IsPrimaryKey = true)] publicint ID; [Column] publicstringName; }

  33. LINQ to SQL publicclassMyDataContext: DataContext {publicstaticstringDBConnectionString = "Data Source=isostore:/ToDo.sdf"; publicMyDataContext(stringconnectionString) : base(connectionString) { } publicTable<Customer> customers; }

  34. SQLMETAL Ręczne mapowanie tabel na klasy może być trudne Zajmuje dużo czasu Łatwo o błąd Rozwiązanie - SQLMETAL

  35. SQLMETAL sqlmetal baza /code:wynik /language:csharp /namespace:nazwaNS /context:nazwaDC /pluralize Można wybrać język Można zmienić namespace Można wygenerować DataContext Sam tworzy liczby mnogie (po angielsku) Są nakładki graficzne

  36. LINQ to EF [TEdmEntityType(NamespaceName= "NutshellModel", Name = "Customer")] Public partialclassCustomer { [EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)] publicint ID; [EdmScalarProperty(EntityKeyProperty = false, IsNullable = false)] publicstringName; }

  37. Entity Framework Nie pytamy bazy – pytam Entity Data Model Potrzebujemy Conceptual Model (opisuje EDM) Store Model (opisuje Database Schema) Mapping (jak się ma CM do SM)

  38. Entity Framework Ręczne tworzenie klas może być nudne i błędogenne (jak zawsze) W Visual Studio możemy dodać projekt ADO.NET Entity Data Model Stworzy on plik konfiguracyjny i wszystkie klasy

  39. Entity Framework Możemy mapować wiele tabel na jedną encję Możemy mapować jedną tabelę na wiele encji Podejście Table per hierarchy Table per type Table per concretetype

  40. Jak to działa Dotychczas nasze LINQ działały na obiektach lokalnych – były to localqueries Aby skorzystać z bazy używamy expressiontrees Wykorzystujemy do tego interfejs IQueryable i fluentsyntax

  41. Jak to działa IQueryable<string> query= (fromcincustomerswherec.Name.Contains("a") orderbyc.Name.Lengthselectc.Name.ToUpper()); IQueryable<string> query= customers.Where(c => c.Name.Contains("a")).OrderBy(c => c.Name.Length).Select(c => c.Name.ToUpper()); Następnie kompilator dopasowuje funkcje do interfejsu IEnumerable lub IQueryable Wybiera ten drugi i tworzy drzewo wywołań, które jest interpretowane w trakcie wykonania (a nie kompilacji)

  42. Jak to działa

  43. ExpressionTrees Expressiontrees można mieszać z localqueries Są leniwe Metoda AsEnumerable

  44. LINQ to XML Wykorzystuje DOM (a właściwie X-DOM) Wykorzystuje interfejs IEnumerable Jest zgodne z wytycznymi W3C stringxml = @"<customer id='123' status='archived'> <firstname>Joe</firstname> <lastname>Bloggs<!--nice name--></lastname> </customer>";

  45. PLINQ Automatycznie „wielowątkuje” zapytanie Działa jedynie z LINQ to Objects! AsParallel AsSequential AsOrdered / AsUnordered WithDegreeOfParallelism AggregateException

  46. Przykład IEnumerable<int> numbers = Enumerable.Range(3, 100000 - 3); varparallelQuery = from n innumbers.AsParallel() whereEnumerable.Range(2, (int)Math.Sqrt(n)).All(i => n % i > 0) select n;

  47. Linki http://msdn.microsoft.com/en-us/library/bb397926.aspx http://msdn.microsoft.com/en-us/library/bb386976.aspx http://msdn.microsoft.com/en-us/library/bb386964.aspx Albo po prostu bingować

More Related