Language Integrated Query
description
Transcript of Language Integrated Query
![Page 2: Language Integrated Query](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/2.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/3.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/4.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/5.jpg)
Hierarchia• Ogólnoświatowym szefem programu
jest Michelle Fleming• APM w Polsce• SC dla Małopolski• SP AGH• WY!!!
![Page 6: Language Integrated Query](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/6.jpg)
Działalność grupy• Spotkania• Szkolenia• Certyfikaty• Staże i praktyki• IT Academic Day• ImagineCup• Code Camp• Noc z technologią
![Page 7: Language Integrated Query](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/7.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/8.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/9.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/10.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/11.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/12.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/13.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/14.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/15.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/16.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/17.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/18.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/19.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/20.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/21.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/22.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/23.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/24.jpg)
Jak to działa?
![Page 25: Language Integrated Query](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/25.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/26.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/27.jpg)
Jak działa Deferred Execution
![Page 28: Language Integrated Query](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/28.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/29.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/30.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/31.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/32.jpg)
LINQ to SQL[Table(Name=”Customers”)]public class Customer{
[Column(IsPrimaryKey = true)]public int ID;
[Column]public string Name;
}
![Page 33: Language Integrated Query](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/33.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/34.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/35.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/36.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/37.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/38.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/39.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/40.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/41.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/42.jpg)
Jak to działa
![Page 43: Language Integrated Query](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/43.jpg)
Expression Trees• Expression trees można mieszać z
local queries• Są leniwe• Metoda AsEnumerable
![Page 44: Language Integrated Query](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/44.jpg)
![Page 45: Language Integrated Query](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/45.jpg)
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](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/46.jpg)
![Page 47: Language Integrated Query](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/47.jpg)
![Page 48: Language Integrated Query](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/48.jpg)
PLINQ• Automatycznie „wielowątkuje”
zapytanie• Działa jedynie z LINQ to Objects!• AsParallel• AsSequential• AsOrdered / AsUnordered• WithDegreeOfParallelism• AggregateException
![Page 49: Language Integrated Query](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/49.jpg)
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 50: Language Integrated Query](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/50.jpg)
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ć
![Page 51: Language Integrated Query](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/51.jpg)
Pytania?
![Page 52: Language Integrated Query](https://reader036.fdocuments.in/reader036/viewer/2022062411/568166bb550346895ddac3c6/html5/thumbnails/52.jpg)
Sprawy organizacyjne• Rejestracja na Code Guru• Wybór terminu spotkań• Konkurs Geek Club• Praca• Projekty• Piwo