language integrated query

53
Language Integrated Query Adam Furmanek adam.furmanek@studentpartne r.pl

Upload: will

Post on 24-Feb-2016

142 views

Category:

Documents


0 download

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

TRANSCRIPT

Page 1: Language  Integrated  Query

Language Integrated Query

Adam [email protected]

Page 2: Language  Integrated  Query

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

Page 3: Language  Integrated  Query

Microsoft Student Partners• Ogólnoświatowy program zrzeszający

grupy .NET i IT• Setki uczelni• Tysiące członków

Page 4: Language  Integrated  Query

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

Page 5: Language  Integrated  Query

Hierarchia• Ogólnoświatowym szefem programu

jest Michelle Fleming• APM w Polsce• SC dla Małopolski• SP AGH• WY!!!

Page 6: Language  Integrated  Query

Działalność grupy• Spotkania• Szkolenia• Certyfikaty• Staże i praktyki• IT Academic Day• ImagineCup• Code Camp• Noc z technologią

Page 7: Language  Integrated  Query

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.

Page 8: Language  Integrated  Query

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

Page 9: Language  Integrated  Query

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ń

Page 10: Language  Integrated  Query

Projekt LINQJę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…

Page 11: Language  Integrated  Query

Delegaty• Można je sobie wyobrażać jako

wskaźniki na funkcje• private delegate int Do (char x);• Mogą zawierać kilka metod• Jeżeli nie są void – zwracają wynik

ostatniej funkcjiDo transform;transform += method1;transform += method2;transform('5');

Page 12: Language  Integrated  Query

Wbudowane delegaty• Action:public delegate void Action<T>(T obj);Opcjonalnie przyjmuje parametr, nic nie zwraca• Func:public delegate TResult Func<TResult>();Opcjonalnie przyjmuje parametr i zwraca

Page 13: Language  Integrated  Query

Wyrażenia lambda• Nienazwana metoda zapisana w

miejscu delegata• (parameters) => expression-or-statement-

block• Można pominąć nawiasy, gdy jeden

parametrtransform += (c) => (int) c;

Page 14: Language  Integrated  Query

Closures• Wyrażenie lambda może

„przechwycić” lokalne zmienne• Wartości są obliczane dopiero przy

wykonywaniu wyrażeniaint factor = 2;Func<int, int> multiplier = n => n * factor;factor = 10;Console.WriteLine(multiplier(3)); // 30

Page 15: Language  Integrated  Query

Closures• Przechwycone zmienne w pętli

zachowuję się tak, jakby były deklarowane poza pętlą

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

Page 16: Language  Integrated  Query

Closures• Dlaczego 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

Page 17: Language  Integrated  Query

Closures• Jak 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

Page 18: Language  Integrated  Query

Closures• Wyrażenie lambda może zmieniać

przechwycone zmienneint seed = 0;Func<int> natural = () => seed++;Console.WriteLine(natural()); // 0Console.WriteLine(natural()); // 1Console.WriteLine(seed); // 2

Page 19: Language  Integrated  Query

Closures• Przechwycone zmienne żyją tak długo, jak długo żyje

wyrażeniestatic Func<int> Natural(){

int seed = 0;return () => seed++; // Returns a closure

}static void Main(){

Func<int> natural = Natural();Console.WriteLine(natural()); // 0Console.WriteLine(natural()); // 1

}

Page 20: Language  Integrated  Query

Extension methods• Służą do rozszerzania innych klas• Są zawsze statyczne• W pierwszym parametrze przyjmują

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

Page 21: Language  Integrated  Query

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

public static TSource First<TSource>(this IEnumerable<TSource> source);

public static int Max(this IEnumerable<int> source);

public static int Sum(this IEnumerable<int> source);

public static IEnumerable<TResult> Select<TSource, TResult>( this IEnumerable<TSource> source, Func<TSource, int, TResult> selector);

public static IEnumerable<TSource> Where<TSource>( this IEnumerable<TSource> source, Func<TSource, bool> predicate);

Page 22: Language  Integrated  Query

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

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

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

Page 23: Language  Integrated  Query

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);

JAYMARYHARRY

Page 24: Language  Integrated  Query

Jak to działa?

Page 25: Language  Integrated  Query

LINQ to Objects• Operują na danych lokalnych• Składnią przypominają SQLstring[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" };IEnumerable<string> 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);

Page 26: Language  Integrated  Query

LINQ to Objects• n jest tak zwaną range-variable• Wyrażenie LINQ jest kompilowane do

extension methods• Deferred Execution - Wyrażenie jest

wykonywane dopiero w momencie wykorzystania wyniku – wyjątkiem są wyrażenia zwracające coś innego od IEnumerable<>

Page 27: Language  Integrated  Query

Jak działa Deferred Execution

Page 28: Language  Integrated  Query

Mieszanie składnistring[] names = { "Tom", "Dick", "Harry",

"Mary", "Jay" }; int matches = ( from n in names where n.Contains("a") select n) .Count(); // 3

Page 29: Language  Integrated  Query

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 varvar a = 3;

Page 30: Language  Integrated  Query

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

Page 31: Language  Integrated  Query

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

Page 32: Language  Integrated  Query

LINQ to SQL[Table(Name=”Customers”)]public class Customer{

[Column(IsPrimaryKey = true)]public int ID;

[Column]public string Name;

}

Page 33: Language  Integrated  Query

LINQ to SQLpublic class MyDataContext : DataContext{

public static string DBConnectionString = "Data Source=isostore:/ToDo.sdf";

public MyDataContext(string connectionString) : base(connectionString)

{ }

public Table<Customer> customers;}

Page 34: Language  Integrated  Query

SQLMETAL• Ręczne mapowanie tabel na klasy

może być trudne• Zajmuje dużo czasu• Łatwo o błąd• Rozwiązanie - SQLMETAL

Page 35: Language  Integrated  Query

SQLMETAL

• Można wybrać język• Można zmienić namespace• Można wygenerować DataContext• Sam tworzy liczby mnogie (po

angielsku)• Są nakładki graficzne

sqlmetal baza /code:wynik /language:csharp /namespace:nazwaNS /context:nazwaDC /pluralize

Page 36: Language  Integrated  Query

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;}

Page 37: Language  Integrated  Query

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)

Page 38: Language  Integrated  Query

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

Page 39: Language  Integrated  Query

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 concrete type

Page 40: Language  Integrated  Query

Jak to działa• Dotychczas nasze LINQ działały na

obiektach lokalnych – były to local queries

• Aby skorzystać z bazy używamy expression trees

• Wykorzystujemy do tego interfejs IQueryable i fluent syntax

Page 41: Language  Integrated  Query

Jak to działa• IQueryable<string> query = (

from c in customers where c.Name.Contains("a") orderby c.Name.Length select c.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)

Page 42: Language  Integrated  Query

Jak to działa

Page 43: Language  Integrated  Query

Expression Trees• Expression trees można mieszać z

local queries• Są leniwe• Metoda AsEnumerable

Page 44: Language  Integrated  Query
Page 45: Language  Integrated  Query

LINQ to XML• Wykorzystuje DOM (a właściwie X-

DOM)• Wykorzystuje interfejs IEnumerable• Jest zgodne z wytycznymi W3C

string xml = @"<customer id='123' status='archived'><firstname>Joe</firstname>

<lastname>Bloggs<!--nice name--></lastname></customer>";

Page 46: Language  Integrated  Query
Page 47: Language  Integrated  Query
Page 48: Language  Integrated  Query

PLINQ• Automatycznie „wielowątkuje”

zapytanie• Działa jedynie z LINQ to Objects!• AsParallel• AsSequential• AsOrdered / AsUnordered• WithDegreeOfParallelism• AggregateException

Page 49: Language  Integrated  Query

PrzykładIEnumerable<int> 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;

Page 51: Language  Integrated  Query

Pytania?

Page 52: Language  Integrated  Query

Sprawy organizacyjne• Rejestracja na Code Guru• Wybór terminu spotkań• Konkurs Geek Club• Praca• Projekty• Piwo

Page 53: Language  Integrated  Query

Dziękuję za uwagęAdam Furmanek

Akademia Gó[email protected]