avatar
Today is Friday
October 18, 2019

Search Results Archives: May 2007

May 29, 2007

Wat is een Lambda Expression?

by tsnoei — Categories: Uncategorized — No Comments - Afdrukken Afdrukken

LambdaExpressions.pngDe Lambda Expression is 1 van de nieuwe taalfeatures van C# 3.0. De nieuwe Visual Studio gaat hier ondersteuning voor bieden. Wat is een Lambda Expression eigenlijk?

Delegates
Even terug naar C# 1.0, daar begon het allemaal met delegates. Een delegate is eigenlijk een blauwdruk van een methode. Bijvoorbeeld

public delegate bool IsTrue(Person P);

Bovenstaande delegate beschrijft een functie die een Person object als parameter verwacht en een boolean teruggeeft. Vervolgens kan er een functie worden gemaakt die met de delegate overeenkomt. Bijvoorbeeld:

public bool FirstNameStartsWithT(Person per)
{
  return per.FirstName.StartsWith("T");
}

Het voordeel van een delegate is dat de implementatie van de functie onafhankelijk is van de delegate blauwdruk. Zo zou de volgende implementatie ook prima overeenkomen met de genoemde delegate.

public bool IsBirthDateAvailable(Person per)
{
  return per.BirthDate != null;
}

We kunnen met onderstaande methode de resultaten van beidde delegate implementaties testen:

private bool Test(IsTrue CheckTrue)
{
   return CheckTrue(P);
}

Bovenstaande functie roepen we in C# 1.0 als volgt aan:

bool result = Test(new IsTrue(FirstNameStartsWithT));

Delegates worden ook gebruikt in het event model van het .NET framework. In dat geval praten we over EventHandlers. Aangezien bovenstaande oplossing vrij omslachtig is als het gaat om een vrij simpele implementatie van een functie op basis van een delegate is er in C# 2.0 de anonymous method geintroduceerd.

Anonymous Methods
Dankzij de Anonymous Method hoeven we in bovenstaande geval geen specifiek implementatie te schrijven voor de IsTrue delegate maar kunnen we de FirstNameStartsWithT test als volgt formuleren:

return Test(
        delegate(Person per)
        {
          bool result = per.FirstName.StartsWith("T");
        } );

Het grote voordeel, de inhoud van de functie FirstNameStartsWithT kan direct worden meegegeven zonder er een specifieke method te hoeven schrijven, een anonieme methode dus…

Lambda Expressions
Aangezien dit ook nog een redelijk omslachtige schrijfwijze is heeft men in C# 3.0 de Lambda Expression geintroduceerd. Syntactisch worden als eerste de parameters benoemd, benaming naar eigen keuze. Dan volgt “=>” daarna volgt de implementatie zoals in het bovenstaande delegate en anonymous method voorbeeld. Dus..

<code>bool result = Test(per => per.FirstName.StartsWith("T"));</code>

Deze korte schrijfwijze heeft zijn effect op de LINQ implementatie. Het is echter de vraag of dat dankzij de Lambda Expression mogelijk werd of dat de Lambda Expression zijn bestaan dankt aan de LINQ implementatie ;-) Ach, dat zullen we nooit weten…

LambdaExpressionsTest.zip – Voorbeeldcode voor Visual Studio Orcas Beta 1

May 22, 2007

WPF, WPF/E, Silverlight en XBAP

by tsnoei — Categories: Uncategorized — No Comments - Afdrukken Afdrukken

WPF.JPGIk ben al een tijdje in mijn vrije tijd aan het rommelen met WPF. De termen vliegen om je oren, maar wat is wat, waarvoor en hoe. Kortom dat kwam na een tijdje bij mij boven borrelen. Na wat zoekwerk heb ik het een en ander op een rijtje.

WPF is door Microsoft gelanceerd als de opvolger van het al verouderde WinForms ontwikkelmodel. WPF staat voor Windows Presentation Foundation, voorheen Avalon genoemd. Belangrijkste vooruitgang die met de introductie van WPF wordt geboekt is dat presentatie en logica nu strikter gescheiden zijn. De presentatie kan nu theoretisch gesproken gemakkelijker gebeuren door designers terwijl de businesslogic door de developers kan worden gedaan. In WPF worden windows (vergelijkbaar met forms) volledig beschreven in XAML een op XML gebaseerde taal. WPF combineert de kracht van 2 werelden. WinForms, het sterk interactieve model en Web dat geen beperkingen legt op vormgeving. WPF gaat nog verder, mogelijkheden als een roterend filmpje in een item van een listview zijn makkelijk te realiseren. Het is bovendien ook niet heel moeilijk zelf controls te bouwen. Een goed boek over WPF is Applications = Code + Markup van Charles Petzold. Met tools als Microsoft Expression Studio (met name Blend) kunnen gemakkelijk WPF applicaties gebouwd worden. Maar ook in de komende versie van Visual Studio, Visual Studio codename Orcas beschikt over mogelijkheden tot het maken van de diverse soorten WPF applicaties.

WPF/E, WPF Everywhere sinds kort officieel Silverlight genoemd. WPF/E bevat een subset van WPF met alleen de presentatielaag. De gestripte versie bevat bijvoorbeeld enkel een TextBlock control en geen button, listbox en welke andere controls dan ook. WPF/E is bedoeld voor het gebruik in browsers en biedt cross-platform ondersteuning. Het grote voordeel van deze gestripte versie is dat het in principe in een aantal browsers bruikbaar is middels plug-in van +/- 2Mb. Daarmee wordt meteen het voordeel duidelijk dat alleen de plug-in en niet het volledige .NET 3.0 framework op de client geïnstalleerd hoeft te worden (a 54Mb).

Bekijk deze Silverlight klok eens.. Wil je zelf aan de slag met Silverlight dan is dit een leuke tutorial om mee te beginnen.

XBAP, naast WPF/E is er ook nog de XBAP browser oplossing. XBAP staat voor XAML Browser Applications. Voor het gebruik van XBAP binnen de browser dient wel het volledige .NET 3.0 framework op de cliënt geïnstalleerd te zijn. Maar, dat heeft als voordeel dat WPF in al zijn facetten aanwezig en te gebruiken is. Ten opzichte van de “gewone” standalone WPF applicatie is er wel het verschil dat XBAP in een security sandbox draait waarbij rechten zijn ingeperkt zoals bijvoorbeeld toegang tot het bestandssysteem. Wil je een gecentraliseerde oplossing met een rijke GUI waarbij je bijvoorbeeld gebruik maakt van een webservice dan kan dit een prima mogelijkheid zijn.

May 14, 2007

Vage MS Access exceptions

by tsnoei — Categories: Uncategorized — No Comments - Afdrukken Afdrukken

AccessException.PNGWie kent ze niet, bijzonder vaag omschreven MS Access foutmeldingen in combinatie met een C# applicatie. Onlangs kwam ik er weer 2 tegen van het type, uren staren en dan nog niet begrijpen wat het probleem is. Hier komen ze.

Nummer 1: “Data type mismatch in criteria expression”
Ik kreeg deze melding bij het uitvoeren van een update van een record in mijn MS Access database. Bij insert trad dit probleem niet op. Uiteindelijk na lang zoeken bleek het te maken te hebben met de DateTime velden. Als ik geen DateTime velden meenam in de update was er niets aan de hand. Voor je daar achter bent ben je natuurlijk ff bezig. Wat bleek MS Access vindt het niet leuk als de milliseconds van een DateTime een waarde heeft die anders is dan “0″. Dit geldt echter alleen bij een update statement, voor een insert is het geen probleem en wordt de millisecond waarde gewoon opgeslagen in de database. De waarde is er ook uit te vissen op 1/1000 nauwkeurig. Pffff, is dat unexpected behavior of niet…

Nummer 2: “Operation must use an updateable query”
Hoe vaag… Wat is een updateable query? Ik weet wel wat een update query is en die schoot ik bij het optreden van deze exceptie naar binnen. Een melding als “.mdb file is readonly” zou beter op zijn plek zijn. Readonly vlag van het mdb bestand en de operatie met de updateable query kon ongestoord doorgang vinden binnen de ondoorgrondelijke radars van de motor die Access heet.

Ik hoor je denken: “Ach, gebruik ook gewoon SQL-Server stumper.” ;-)

May 8, 2007

(D)LINQ

by tsnoei — Categories: Uncategorized — 1 Comment - Afdrukken Afdrukken

LINQ.pngNa de installatie van VS Orcas (de opvolger van Visual Studio 2005) een tijdje geleden alweer, ben ik eindelijk eens met Orcas gaan stoeien. M’n laptop had het overigens wel zwaar met het draaien van 2 operating systemen tegelijkertijd. Orcas draait namelijk onder Microsoft Virtual PC met Windows 2003 operating systeem. Mijn laptop is uitgerust met 1 Gb geheugen maar toch is mijn systeem dan continue aan het swappen. Is Orcas in de lucht dan duld mijn OS geen enkele andere RAM-vretende applicatie zoals Outlook of Onenote. Dit heeft me een tijdje weerhouden van het onderzoeken van LINQ maar ik ben nu toch maar aan de slag gegaan. Met het vooruitzicht van een geheugenuitbreiding van een halve Gig (bedankt baas) wil ik nu wel even in de wacht staan.

Een leuke nieuwe feature in Orcas is onder andere ondersteuning van de LINQ syntax. LINQ staat voor Language INtegrated Query en voorziet in de mogelijkheid met SQL-achtige queries binnen je code data te verzamelen uit bijvoorbeeld collections. De scheidslijn tussen database data en object data wordt hierdoor een stuk kleiner.

Om te beginnen heb ik binnen Orcas een Console applicatie aangemaakt. In de main functie van Program.cs heb ik de volgende code geschreven:

string[] names = new string[] { "Jan", "Piet", "Bob", "Klaas", "Koos" };
IEnumerable result = from n in names where n.Length <= 4 orderby n select n;
foreach (string res in result)
   Console.WriteLine(res);

Console.WriteLine("Press a key");

In deze code wordt een string array gecreeerd met namen. De LINQ query, op regel 2, is van het type IEnumerable en verzamelt alle namen met een lengte van maximaal 4 karakters en sorteert daarnaast de namen op alfabet. In de foreach lus worden de namen naar de console geschreven. Het resultaat is dus dit:

Console1.JPG

Lazy loading?
Wat belangrijk is om te weten is dat op de 2e regel waarbij de LINQ query wordt toegewezen aan de variabele IEnumerable “result” niet het resultaat wordt vastgelegd maar enkel de query definitie. Als op de 3e regel daadwerkelijk in de foreach loop van de IEnumerable de items op worden gevraagd, dan wordt pas daadwerkelijk de selectie van de data uitgevoerd. In dit geval is het om het even. Maar gaan we gebruiken maken van een database voor het ophalen van data via een DLINQ query dan is dit weldegelijk een relevant gegeven! We hebben het hier dus over mix tussen normale en lazy loading.

Meer voorbeelden van LINQ queries kan je vinden op de “101 LINQ samples” pagina van Microsoft.

Nu wat meer over DLINQ en laat je verbazen. LINQ op zich geeft mij al een WOW! gevoel, maar DLINQ is echt WOW! in het kwadraat. Het stappenplan:

  1. Ga gewoon verder in dezelfde console applicatie
  2. Aangezien op de Virtual PC image ook SQL Server is geinstalleerd, creeer een database.
  3. Creeer 2 tabellen in de database 1 met de naam “Medewerker” en een andere met de naam “Bedrijf”.
  4. Voeg de volgenden velden toe aan de tabel “Medewerker”: Id (int), Voornaam, Achternaam, BedrijfId (int).
  5. Medewerker.JPG

  6. Voeg de volgenden velden toe aan de tabel “Bedrijf”: Id (int), Naam.
  7. Bedrijf.JPG

  8. De Id velden in beide tabellen zijn van het type Identity.
  9. Leg een Foreign key relatie van Medewerker.BedrijfId naar Bedrijf.Id.
  10. Relationship.JPG

  11. Nu kiezen we voor ons console project Add > New Item > LINQ To SQL File. We noemen de file Bedrijfsdata.dbml.
  12. DBMLDialog.JPG

  13. Bedrijfsdata.dbml wordt nu getoond. We slepen nu vanuit de “Server Explorer” de tabellen op de dbml.
  14. DBMLBedrijfsdata.JPG

  15. We hebben nu een koppeling gecreeerd met een database die we kunnen gebruiken binnen LINQ. We kunnen nu code gaan kloppen.

Binnen het project is nu de class BedrijfsdataDataContext beschikbaar waarmee we de database kunnen benaderen. Met de volgende code voegen we een bedrijf toe aan de database:

//Creer een nieuwe datacontext
BedrijfsdataDataContext dc = new BedrijfsdataDataContext();
//Creeer een Bedrijf (is automatisch beschikbaar via Context)
Bedrijf b = new Bedrijf();
//Vul de properties
b.Naam = "Conclusion Core Technologies";
//Voeg het bedrijf toe in de context
//Door engelse context wordt lijst met bedrijven "Bedrijfs" genoemd
dc.Bedrijfs.Add(b);
//Sla alle wijzigingen in de context op in de database
dc.SubmitChanges();

Console.WriteLine("Press a key...");

Medewerkers kunnen als volgt aan dit bedrijf worden toegevoegd:

BedrijfsdataDataContext dc = new BedrijfsdataDataContext();
Medewerker m = new Medewerker();
m.Voornaam = "Ton";
m.Achternaam = "Snoei";
m.Bedrijf = (from b in dc.Bedrijfs where
  b.Naam.StartsWith("Conclusion") select b).First();
dc.Medewerkers.Add(m);
dc.SubmitChanges();
Console.WriteLine("Press a key...");

Het leuke is dat voor elke willekeurige medewerker het bedrijfobject kan worden opgevraagd of voor elk bedrijf een lijst met alle medewerkers. Zoals eerder gezegd, het bedrijf object bevat dan wel een property van het type IEnumerable met de naam Medewerkers, dat wil echter niet zeggen dat zich hier een gevulde collectie met medewerkers bevindt. Deze property bevat een definitie om alle medewerkers van het betreffende bedrijf op te halen. Zolang echter niets met de medewerkers property wordt gedaan worden deze dus ook niet uit de database opgehaald. De optimale manier van lazy loading!!

Het is jammer voor teams als die van NHibernate die jaren hebben besteedt aan het bouwen van een mooie oplossing om objecten van en naar een database te “mappen”. Denk eens aan mijn mooie mapper die kan ook de kast in ;-) . Maar een betere object relational mapper als DLINQ ben ik nog niet tegengekomen. Dit komt natuurlijk mede door het feit dat Microsoft vrij is om de syntax van een ontwikkeltaal aan te passen. Daarnaast is het concept natuurlijk ook goed doordacht. Er is wel 1 nadeel, DLINQ werkt vooralsnog alleen met SQL Server.

Ik zou zeggen experimenteer er zelfs een mee. Leuk is ook om de SQL Profiler er bij te pakken om eens te kijken hoe de LINQ queries zich verhouden met SQL. Ik heb zelf ervaren dat dit heel leerzaam is. Voor degene die ook al een blik hebben geworpen op WPF is het duidelijk dat het koppelen van data op alle vlakken gemakkelijker is geworden.

Kortom, ik denk dat we hier met zijn alle heel veel profijt van gaan hebben. Ik kan niet wachten tot de officiele release uit is van Orcas en kan elk bedrijf dan ook aanraden direct over te stappen op dit nieuwe concept. Er valt heel wat geld te besparen, want over het algemeen slokt een datalaag toch een redelijk deel van een ontwikkelbudget op van een willekeurig project.

© 2019 Snoei's .NET blog All rights reserved - Wallow theme v0.44 by ([][]) TwoBeers - Powered by WordPress - Have fun!