MS certificering: 70-483, deel 9

Ingediend door Dirk Hornstra op 28-mar-2018 20:20

Vanavond, 28 maart 2018, door met de laatste video van C# Jump Start Video. Module 8. Async en await zou al in module 7 besproken worden, maar dat konden de mannen niet meer in dat uurtje proppen. De beschrijving van deze module geeft mij de indruk dat ik hier niet echt nieuwe zaken in tegen zal komen, maar je weet het niet. Als ik deze video bekeken heb ben ik nog (lang) niet klaar. Want dan ken je wat theorie, maar het examen zal vast over meer zaken en nog niet besproken statements en functionaliteiten gaan. Ik heb hier nog een 209 MB zip-bestand, xaml.zip, waarnaar verwezen wordt in de video's, archive.codeplex.com. Die moeten we nog uitpakken en doorlopen. Daarna alle specs van het examen en welke onderdelen ik dan nog niet voldoende behandeld heb online opzoeken. Er komt dus zeker nog een vervolg-blog-post!

Vanuit Silverlight moest je asynchroon met services werken. Je wilt niet dat de applicatie bevriest op een langdurig proces. Async en await maken asynchroon programmeren een stuk simpeler. Het staat asynchrone code toe in een overzicht van wat synchrone code lijkt. Methoden gemarkeerd met async mogen een Task<T> teruggeven. Async geeft aan dat await gebruikt mag worden. Await geeft de opdracht om met resultaat terug te komen. Await geeft de compiler de instructie dat de uitvoering vervolgd moet worden in dezelfde context als de operatie uitgevoerd is.

We krijgen een voorbeeld van hoe het was:


public event EventHandler<DownloadStringCompletedEventArgs> Completed;
void GetHtml(string url)
{
   var client = new WebClient {};
   client.DownloadStringCompleted += client_DownloadStringCompleted;
   client.DownloadStringAsync(new Uri(url));
}

void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
   if (Completed != null) Completed(this, e);
}

En hoe het nu is:


async Task<string> GetHtml(string url)
{
   var client = new WebClient {};
   var html = await client.DownloadStringTaskAsync(url);
   return html;
}

We gaan door met databases. Het is een data store. Wat je opslaat is gestructureerd. Opgeslagen gegevens kunnen gerelateerd zijn, referential integrity. Het geeft een manier om data te benaderen / zoekopdrachten uit te voeren. Je optimaliseert dat met indexes.

Voorbeelden, Windows Azure SQL Database, Local Network SQL Server, Local Machine SQL Server Express, Application SQL LocalDB, Application SQL CE, andere providers: Oracle, SqLite, MySql, DB2, Jet. Ado.Net implementeert een provider-model die veel databases kan benaderen. De database implementatie is abstract gemaakt.

Je hebt low-level toegang: handmatige query's, DbDataReader. ADO.Net. Object Relationship Models (ORM), Conceptual Modelling en Entity Framework, Nhibernate, CSLA, Dapper.

We krijgen een voorbeeld. Nieuw blanco project. We voegen een Local Database toe, je krijgt een Database1.sdf-bestand. Je kunt een Dataset of een Entity Data Model. We kiezen voor de EDM. We koppelen deze aan de Database1.sdf. Via view - server explorer kunnen de tabellen toegevoegd worden. Dat wordt gedaan, daarna voegen we een Entity-Model toe. We krijgen wat voorbeeldcode te zien. We gebruiken de Database1Entities() waarbij een Predicate gaan gebruiken (context.Products.Where...). We kunnen lambda-opdrachten gebruiken. De SQL die gegenereerd wordt is niet altijd optimaal. Met grote hoeveelheden data is het dan economischer om een stored procedure te gebruiken.

We zagen al LINQ, Language Integrated Query. Het is een algemeen te gebruiken Query Taal. Het is een geïntegreerd onderdeel van de .NET programmeertalen. Het is Type Safe en zit in de Intellisense. Bevat Traversal, Filter, Projection. Kan geoptimaliseerd worden met compiler-versies. Door de Query Syntax te gebruiken kun je het uitvoeren. Met de Method Syntax kun je het ook uitvoeren. 

We krijgen een demo te zien. De Query Syntax, een soort SQL. Maar je hebt ook de Method Syntax (.Where(), .First()). 
 


var data = Enumerable.Range(1, 50);
var method = data.Where(x => x % 2 == 0).Select(x => x.ToString());


var query = 
from d in data
where d % 2 == 0
select d.ToString();
Debugger.Break(); // hardcoding a break-point. bij Release gaat ie eruit.

var projection = 
from d in data
select new 
{
   Even = (d % 2 == 0),
   Odd = !(d % 2 == 0),
   Value = d
};

var letters = new [] { "A", "C", "B", "E", "Q"};
var sortAsc =
from d in letters
orderby d ascending
select d;

var sortDesc = letters.OrderByDescending(x => x);

var values = new [] { "A", "B", "A", "C", "A", "D"};
var distinct = values.Distinct();
var first = values.First();
var firstOr = values.FirstOrDefault();
var last = values.Last();
var page = values.Skip(2).Take(2);

// aggregates
var numbers = Enumerables.Range(1,50);
var any = numbers.Any(x => x % 2 == 0);
var count = numbers.Count(x => x % 2 == 0);

LINQ gebruikt een expression-tree. Deze kun je zelf aanpassen. De mannen hebben het over dat het altijd een AND is, als je zelf een OR wilt toevoegen zul je dat moeten doen.