Click here to load reader

Language Integrated Query

  • View
    102

  • Download
    0

Embed Size (px)

DESCRIPTION

Language Integrated Query. Adam Furmanek [email protected] 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. - PowerPoint PPT Presentation

Text of Language Integrated Query

WINDOWS PHONE 7

Language Integrated QueryAdam [email protected] semestrCo to jest LINQDelegatyWyraenia lambdaExtension methodsLINQ to SQL, LINQ to EF, LINQ to XMLPLINQPodsumowanieMicrosoft Student PartnersOglnowiatowy program zrzeszajcy grupy .NET i ITSetki uczelniTysice czonkw3Historia programu2001 wtedy wszystko si zaczoW cigu 5 lat program dziaa w pitnastu krajachW kocu 2006 roku zosta rozszerzony na 50 pastwObecnie istnieje w ponad 100 krajach i ma niemal 3000 czonkw4HierarchiaOglnowiatowym szefem programu jest Michelle FlemingAPM w PolsceSC dla MaopolskiSP AGHWY!!!5Dziaalno grupySpotkaniaSzkoleniaCertyfikatyStae i praktykiIT Academic DayImagineCupCode CampNoc z technologi6Co to jest LINQ?LINQ - .NET Language-Integrated Query

Zestaw deklaratywnych zapyta oglnego przeznaczenia, sucych do dostpu do rnych rde danych z aplikacji obiektowych.7Co to jest LINQ?Technologia LINQ jest dostpna na platformie Microsoft .Net Framework od wersji 3.5Aktualnie dostpna dla jzykw C# i Visual Basic.NetDostpne porty dla Javy, PHP i JavaScriptuWpyw na powstanie mia SQL i HaskellCo to jest LINQ?LINQ to zbir operatorw zapyta (ang. standard query operators) umoliwiajcych m.in.:przegldanie danychfiltrowanie/selekcje danychprojekcje danych

LINQ udostpnia przyjazn, skrtow metod zapisu operatorw zapytaProjekt LINQJzyk: C#Jzyk: VBInne jzyki.Net Language Integrated Query (LINQ)rda danych LINQLINQ To ObjectsLINQ To DataSetsLINQ To SQLLINQ To EntitiesLINQ To XMLInne

DelegatyMona je sobie wyobraa jako wskaniki na funkcjeprivate delegate int Do (char x);Mog zawiera kilka metodJeeli nie s void zwracaj wynik ostatniej funkcjiDo transform;transform += method1;transform += method2;transform('5');Wbudowane delegatyAction:public delegate void Action(T obj);Opcjonalnie przyjmuje parametr, nic nie zwracaFunc:public delegate TResult Func();Opcjonalnie przyjmuje parametr i zwracaWyraenia lambdaNienazwana metoda zapisana w miejscu delegata(parameters) => expression-or-statement-blockMona pomin nawiasy, gdy jeden parametrtransform += (c) => (int) c;

ClosuresWyraenie lambda moe przechwyci lokalne zmienneWartoci s obliczane dopiero przy wykonywaniu wyraeniaint factor = 2;Func multiplier = n => n * factor;factor = 10;Console.WriteLine(multiplier(3)); // 30

ClosuresPrzechwycone zmienne w ptli zachowuj si tak, jakby byy deklarowane poza ptl

Action[] actions = new Action[3];for (int i = 0; i < 3; i++) actions[i] = () => Console.Write(i);foreach (Action a in actions) a(); // 333

ClosuresDlaczego tak jest?

Action[] actions = new Action[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

ClosuresJak sobie z tym poradzi? Skopiowa zmienn.

Action[] actions = new Action[3];for (int i = 0; i < 3; i++){ int loopScopedi = i; actions[i] = () => Console.Write(loopScopedi);}foreach (Action a in actions) a(); // 012

ClosuresWyraenie lambda moe zmienia przechwycone zmienneint seed = 0;Func natural = () => seed++;Console.WriteLine(natural()); // 0Console.WriteLine(natural()); // 1Console.WriteLine(seed); // 2

ClosuresPrzechwycone zmienne yj tak dugo, jak dugo yje wyraeniestatic Func Natural(){int seed = 0;return () => seed++; // Returns a closure}static void Main(){Func natural = Natural();Console.WriteLine(natural()); // 0Console.WriteLine(natural()); // 1}

Extension methodsSu do rozszerzania innych klasS zawsze statyczneW pierwszym parametrze przyjmuj klas do rozszerzenia

namespace ExtensionMethods { public static class MyExtensions { public static int WordCount(this String str) { return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length; } }}

Wbudowane extension methodspublic static bool Contains(this IEnumerable source, TSource value);

public static TSource First(this IEnumerable source);

public static int Max(this IEnumerable source);

public static int Sum(this IEnumerable source);

public static IEnumerable Select( this IEnumerable source, Func selector);

public static IEnumerable Where( this IEnumerable source, Func predicate);

Co nam to daje?string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" };

IEnumerable longerThanFour = names.Where(s => s.Length > 4);

foreach(string s in longerThanFour){ Console.WriteLine(s);}

Co nam to daje?string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" };

IEnumerable query = names .Where(n => n.Contains("a")) .OrderBy(n => n.Length) .Select(n => n.ToUpper());

foreach (string name in query) Console.WriteLine(name);

JAYMARYHARRY

Jak to dziaa?

LINQ to ObjectsOperuj na danych lokalnychSkadni przypominaj SQL

string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" };IEnumerable query = from n in names where n.Contains("a") // Filter elements orderby n.Length // Sort elements select n.ToUpper(); // Translate each element (project)foreach (string name in query) Console.WriteLine(name);

25LINQ to Objectsn jest tak zwan range-variableWyraenie LINQ jest kompilowane do extension methodsDeferred Execution - Wyraenie jest wykonywane dopiero w momencie wykorzystania wyniku wyjtkiem s wyraenia zwracajce co innego od IEnumerable

Jak dziaa Deferred Execution

Mieszanie skadnistring[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" }; int matches = ( from n in names where n.Contains("a") select n) .Count(); // 3

varCzasami moe by trudno okreli typ zwracany przez funkcjAlbo po prostu jestemy leniwi i nie chce si nam okrela typuZ pomoc przychodzi varvar a = 3;

Typy anonimoweclass TempProjectionItem{ public string Original; // Original name public string Vowelless; // Vowel-stripped name}string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" };IEnumerable temp = from n in names select new TempProjectionItem { Original = n, Vowelless = n.Replace("a", "").Replace("e","") .Replace("i", "") .Replace("o", "") .Replace("u", "") };

Typy anonimowevar query = from n in names select new { Original = n, Vowelless = n.Replace ("a", "") .Replace ("e", "") .Replace ("i", "") .Replace ("o", "") .Replace ("u", "")};

LINQ to SQL[Table(Name=Customers)]public class Customer{[Column(IsPrimaryKey = true)]public int ID;

[Column]public string Name;}

32LINQ to SQLpublic class MyDataContext : DataContext{public static string DBConnectionString = "Data Source=isostore:/ToDo.sdf";

public MyDataContext(string connectionString) : base(connectionString){ }

public Table customers;}33SQLMETALRczne mapowanie tabel na klasy moe by trudneZajmuje duo czasuatwo o bdRozwizanie - SQLMETALSQLMETALMona wybra jzykMona zmieni namespaceMona wygenerowa DataContextSam tworzy liczby mnogie (po angielsku)S nakadki graficznesqlmetal baza /code:wynik /language:csharp /namespace:nazwaNS /context:nazwaDC /pluralize

LINQ to EF[TEdmEntityType(NamespaceName = "NutshellModel", Name = "Customer")]Public partial class Customer{[EdmScalarPropertyAttribute (EntityKeyProperty = true, IsNullable = false)]public int ID;

[EdmScalarProperty (EntityKeyProperty = false, IsNullable = false)]public string Name;}

36Entity FrameworkNie pytamy bazy pytam Entity Data ModelPotrzebujemy Conceptual Model (opisuje EDM)Store Model (opisuje Database Schema)Mapping (jak si ma CM do SM)Entity FrameworkRczne tworzenie klas moe by nudne i bdogenne (jak zawsze)W Visual Studio moemy doda projekt ADO.NET Entity Data ModelStworzy on plik konfiguracyjny i wszystkie klasyEntity FrameworkMoemy mapowa wiele tabel na jedn encjMoemy mapowa jedn tabel na wiele encjiPodejcie Table per hierarchyTable per typeTable per concrete type39Jak to dziaaDotychczas nasze LINQ dziaay na obiektach lokalnych byy to local queriesAby skorzysta z bazy uywamy expression treesWykorzystujemy do tego interfejs IQueryable i fluent syntax

40Jak to dziaaIQueryable query = ( from c in customers where c.Name.Contains("a") orderby c.Name.Length select c.Name.ToUpper());IQueryable query= customers.Where(c => c.Name.Contains("a")).OrderBy(c => c.Name.Length).Select(c => c.Name.ToUpper());Nastpnie kompilator dopasowuje funkcje do interfejsu IEnumerable lub IQueryableWybiera ten drugi i tworzy drzewo wywoa, ktre jest interpretowane w trakcie wykonania (a nie kompilacji)Jak to dziaa

Expression TreesExpression trees mona miesza z local queriesS leniweMetoda AsEnumerable43

44LINQ to XMLWykorzystuje DOM (a waciwie X-DOM)Wykorzystuje interfejs IEnumerableJest zgodne z wytycznymi W3C

string xml = @"JoeBloggs";

PLINQAutomatycznie wielowtkuje zapytanieDziaa jedynie z LINQ to Objects!AsParallelAsSequentialAsOrdered / AsUnorderedWithDegreeOfParallelismAggregateException48PrzykadIEnumerable numbers = Enumerable.Range(3, 100000 - 3);var parallelQuery =from n in numbers.AsParallel()where Enumerable.Range(2, (int)Math.Sqrt(n)).All(i => n % i > 0)select n;

Linkihttp://msdn.microsoft.com/en-us/library/bb397926.aspxhttp://msdn.microsoft.com/en-us/library/bb386976.aspxhttp://msdn.microsoft.com/en-us/library/bb386964.aspxAlbo po prostu bingowaPytania?Sprawy organizacyjneRejestracja na Code GuruWybr terminu spotkaKonkurs Geek ClubPracaProjektyPiwoDzikuj za uwagAdam FurmanekAkademia [email protected] 53

Search related