Outer variables - int outer = 3; - Func f = n => n * outer++; - f(5), f(5). Outer wordt wel verhoogd - Zie Images/CompiledLambda.jpeg - Externe class wordt 'display class' genoemd - Class heeft rare naam - Variabelnaam blijft hetzelfde LINQ, Lambda, etc - Language INtegrated Query - Kan worden gebruikt op: - Objects - Databases - XML documents - Hoe worden LINQ queries gecompileerd? - Zie ComprehensionAndExtension.jpeg - In volgorde: - Oude gecompilde versie - Comprehension syntax - Extension method syntax - Gecompilde versie - Waarom zijn er meerdere syntaxes? - Leesbaarheid - Multicore ready - Is klaar om parallel uitgevoerd te worden - Defered Execution - Defered execution betekent dat de LINQ query pas uitgevoerd wordt, wanneer er een resultaat opgevraagd wordt - IQueryable - Soms fijn, soms niet - Bij .First() hoeft alleen maar een deel van de query uitgevoerd te worden - Bij 2 keer .Count(), wordt de query 2 keer uitgevoerd - Deferred variable kunnen nadelig zijn - Zie DeferredOuterVariable.PNG - filter wordt een field in de nieuwe class waar de lambdas in staan - filter wordt van waarde aangepast en daarna pas gaan beide lambdas deze gebruiken - Query object - Bestaat uit - Array enumerator - Where enumerator - OrderBy enumerator - Selector enumerator - Consumer - Variabele namen eindigen met 'Query', zodat duidelijk wordt dat er een performance penalty is - Comprehension syntax - Volgorde - from - let - instantieert een lokale variabele voor later in de syntax - Nested query - Draait voor elke item opnieuw - Leesbaarheid - where - join - Joins gebruiken we bijna nooit - Entity framework genereert zelf joins. In C# kan je een drilldown gebruiken - orderby - select | group by - Group p by p.Gender - into om queries te chainen - from person in band group person by person.Address into citizens where citizens.Count() > 1 select citizens; - join om groepen samen te voegen - .Join in extension method syntax - Wordt bijna niet gebruikt - Er kan een drilldown gebruikt worden om in properties van persoon te kijken - Persoon.Stad.Naam wordt onder water een SQL join - from beatle in beatles join rollingStone in rollingStones on beatle.Address equals rollingStone.Address select new { Beatle = beatle, RollingStone = rollingstone }; - left of right join is niet echt mogelijk in LINQ - join met into doet een (soort van) left join - Levert een lijst van beatles op met voor elke beatle een lijst van stones (of een lege lisjt) - .GroupJoin in extension method syntax - Een echte left join zou per gematchte stone een beatle outputten - Dus B1 - S1, B1 - S2, B2 - S3, B3 - niks, B4 - niks - Zie LinqLeftJoin.PNG - SQL is oorspronkelijk bedoeld voor managers. Vandaar eerst SELECT - LINQ begint met FROM, zodat de variabele geinstantieerd is - SQL is een untyped taal, dus het heeft niet zoveel nut om met een from te beginnen - Intellisense lijstje - Ordering - Chaining - orderby beatle.Address descending, beatle.Name - .OrderBy(..) is een IOrderedEnumerable met een sort functie - .ThenBy(..) voegt een tweede sort functie aan OrderBy toe - Deze wordt gebruikt als de eerste sort een dubbele oplevert - Sorteert maar 1 keer - .OrderBy(..) levert een IOrderedEnumerable op - Enumerator, Deferred - ThenBy enumerator komt in dezelfde enumerator te staan - ThenBy werkt alleen op een IOrderedEnumerable - Ignoring case wordt lastig in de orderby van de comprehension syntax - .OrderBy(beatle => beatle.Address, StringComparer.InvariantCultureIgnoreCase) - Extension method syntax > Comprehension syntax - .Count() - .Any() - .All() - Comprehension syntax > extension method syntax - Let