<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Websiteudvikler &#187; Microsoft .NET</title>
	<atom:link href="http://websiteudvikler.dk/post/tag/microsoft-net/feed" rel="self" type="application/rss+xml" />
	<link>http://websiteudvikler.dk</link>
	<description>website development, CMS, e-commerce, data integration and web analytics</description>
	<lastBuildDate>Fri, 11 May 2012 19:53:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Spar tid med Custom Attributes i dine klasser</title>
		<link>http://websiteudvikler.dk/post/spar-tid-med-custom-attributes-i-dine-klasser.html</link>
		<comments>http://websiteudvikler.dk/post/spar-tid-med-custom-attributes-i-dine-klasser.html#comments</comments>
		<pubDate>Fri, 20 Apr 2012 21:43:51 +0000</pubDate>
		<dc:creator>Kevin Steffer</dc:creator>
				<category><![CDATA[Microsoft .NET]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Optimering]]></category>

		<guid isPermaLink="false">http://websiteudvikler.dk/?p=685</guid>
		<description><![CDATA[Giv dine kunder en bedre pris for dit arbejde på database INSERT og UPDATES med mit lille trick som er beskrevet her.]]></description>
			<content:encoded><![CDATA[<p>Jeg har haft fornøjelsen af, at arbejde lidt med .NET op mod en MySQL database, hvor jeg ikke kunne bruge LinqToSQL.</p>
<p>Jeg har så i et andet projekt arbejdet med at have mine egne Custom Attributes på klasser og i det her projekt var det helt vild oplagt at bruge til at mappe databasens feltnavne op på klassernes properties.</p>
<p>Eksempel:</p>
<p>Klassen</p>
<pre>
public class Person {
  public string Name { get; set; }

  public Person() {

  }
}
</pre>
<p>Klassen med Custom Attribute</p>
<pre>
public class Person {
  [DbFieldName("name")]
  public string Name { get; set; }

  public Person() {

  }
}
</pre>
<p>Min egen attribute klasse</p>
<pre>
[System.AttributeUsage(System.AttributeTargets.Property)]
public class DbFieldName : System.Attribute
{
  private string name;
  public double version;

  public DbFieldName(string name)
  {
    this.name = name;
    version = 1.0;
  }

  public string GetName()
  {
    return (this.name);
  }
}
</pre>
<p>Pointen med Attributes er at du nøjes med at sætte dem på de Properties der skal gemmes i databasen, så når du skal lave din INSERT eller UPDATE så kører du lige sådan en stump kode her:<br />
Jeg sender en instans a Person &#8220;objPerson&#8221; ind til metoden med denne kode</p>
<pre>
cmd.CommandText = "INSERT INTO Contacts(name) VALUES(?name);";
PropertyInfo[] properties = typeof(Person).GetProperties();
foreach (PropertyInfo property in properties)
{
  DbFieldName attr = property.GetCustomAttributes(typeof(DbFieldName), false).FirstOrDefault() as DbFieldName;
  if (attr != null)
  {
    string name = attr.GetName();

    IDbDataParameter param = cmd.CreateParameter();
    param.ParameterName = string.Format("?{0}",name);
    param.Value = property.GetValue(objPerson, null);
    cmd.Parameters.Add(param);
  }
}
cmd.ExecuteNonQuery();
</pre>
<p>Det er selvfølgelig lidt overkill at skrive sådan for at gemme én værdi i database tabellen, men jeg sad med tabeller med godt 20 felter og da jeg havde 6 klasser af denne type &#8211; så sparede jeg godt med tid og kunne give kunden en god pris for mit arbejde!</p>
<p>I et større projekt ville det give mening, at lave en klasse til at håndtere alle disse klasser Save og Get metoder ved at lave en generisk klasse på typen T.</p>
<p>Håber du får chance for at gøre en kunde glad med min inspiration her.</p>
]]></content:encoded>
			<wfw:commentRss>http://websiteudvikler.dk/post/spar-tid-med-custom-attributes-i-dine-klasser.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dynamicweb 8 i beta med nyt API og Online Marketing Center</title>
		<link>http://websiteudvikler.dk/post/dynamicweb-8-i-beta-med-nyt-api-og-online-marketing-center.html</link>
		<comments>http://websiteudvikler.dk/post/dynamicweb-8-i-beta-med-nyt-api-og-online-marketing-center.html#comments</comments>
		<pubDate>Thu, 03 Nov 2011 21:02:09 +0000</pubDate>
		<dc:creator>Kevin Steffer</dc:creator>
				<category><![CDATA[Dynamicweb]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Microsoft .NET]]></category>

		<guid isPermaLink="false">http://websiteudvikler.dk/?p=623</guid>
		<description><![CDATA[Primært så er Dynamicweb 8 dog et motorskifte forstået på den måde, at selve Dynamicweb koden bliver skiftet ud og omstruktureret til fordel for, at komme op på nyere teknologi, så systemet nu skal køre på Microsofts .NET Framework 4.0]]></description>
			<content:encoded><![CDATA[<p>Dynamicweb 8, som lanceres i januar 2012, er nu gået i Beta test og jeg har i noget tid kigget på deres CTP release.</p>
<p><a href="http://farm7.static.flickr.com/6222/6309816151_5dfb23e35e.jpg"><img class="alignnone" title="Dynamicweb 8 Login" src="http://farm7.static.flickr.com/6222/6309816151_5dfb23e35e.jpg" alt="" width="500" height="307" /></a></p>
<p>Dynamicweb 8 kommer med nogle opdatering til modulerne og et nyt modul, Online Marketing Center, som giver mulighed for, at sætte dine ukendte besøgende lidt i system baseret på nogle informationer, som de både tager med sig, men også lidt om deres tidligere besøg.</p>
<p><a href="http://farm7.static.flickr.com/6222/6309863413_fcf124620d.jpg"><img class="alignnone" title="Dynamicweb 8 Online Marketing Center" src="http://farm7.static.flickr.com/6222/6309863413_fcf124620d.jpg" alt="" width="500" height="307" /></a></p>
<p>Primært så er Dynamicweb 8 dog et motorskifte forstået på den måde, at selve Dynamicweb koden bliver skiftet ud og omstruktureret til fordel for, at komme op på nyere teknologi, så systemet nu skal køre på Microsofts .NET Framework 4.0. Hvad der helt praktisk bliver nyt i Dynamicwebs API kan du følge med i på Dynamicwebs Udviklingschef og medstifters blog <a title="Nicolai Pedersen" href="http://nicolaipedersen.com" target="_blank">http://nicolaipedersen.com</a> hvor der allerede findes flere blogpost om Refactoring af Dynamicwebs API.</p>
<p>Som udvikler på Dynamicweb platformen synes jeg, at dette tiltag er længe ventet. Jeg havde håbet, at Dynamicweb ville have gjort dette arbejde de nu har gjort tilbage til, da de konverterede deres ASP version til .NET, men nu begynder det at ligne noget, der bliver bedre at arbejde med.<br />
En bedre struktur i API&#8217;ets områder, et mere moderne .NET 4 framework som byder på rigtig mange forbedringer og genveje i forhold til at Dynamicwebs eksisterende API bygger primært på .NET 1.1 men også .NET 2.0. Det betyder, at vi nu kan bruge LINQ og selvfølgelig også alle de nye ting som anonyme typer, dynamic type, option parametre og en masse mere, som er kommer dels i .NET 3.5 og 4.</p>
<p>Beta testen viser p.t. at hvis du har fået udviklet på din løsning og dermed har en custom-løsning, så er du nødt til at få din Dynamicweb partner til at teste en opdatering. Der er lavet nogle ret fundamentale ting om i Dynamicwebs API og bare skiftet fra .NET 2 og til .NET 4, giver mig altså nogle problemer, som at Dynamicweb ikke kan finde mine moduler og mine tilpasninger, men hvis jeg åbner mine projektet og opgradere dem til Framework 4.0 og retter et par fejl, så kører det igen, så der ligger forhåbentlig ikke det store i det.</p>
<p>Men standardløsninger, bør være lige til, og bliver også de første som får glæde af den Online Marketing Centeret.</p>
<p>Har du spørgsmål til din Dynamicweb løsning uanset om du har dit eget website i Dynamicweb eller om du er Dynamicweb Partner, så bare spørg, jeg vil gerne undersøge nogle ting for dig &#8211; helt uforpligtende naturligvis.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://websiteudvikler.dk/post/dynamicweb-8-i-beta-med-nyt-api-og-online-marketing-center.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>En app på under 5 min med Visual Studio LightSwitch</title>
		<link>http://websiteudvikler.dk/post/en-app-paa-under-5-min-med-visual-studio-lightswitch.html</link>
		<comments>http://websiteudvikler.dk/post/en-app-paa-under-5-min-med-visual-studio-lightswitch.html#comments</comments>
		<pubDate>Tue, 12 Oct 2010 21:03:29 +0000</pubDate>
		<dc:creator>Kevin Steffer</dc:creator>
				<category><![CDATA[Webudvikling]]></category>
		<category><![CDATA[Microsoft .NET]]></category>

		<guid isPermaLink="false">http://websiteudvikler.dk/?p=536</guid>
		<description><![CDATA[Se demo på at lave en data drevet applikation på under 5 minutter med Visual Studio LightSwitch.]]></description>
			<content:encoded><![CDATA[<p>Microsoft har udgivet et nyt produkt, <a title="Visual Studio LightSwitch" href="http://www.microsoft.com/visualstudio/en-us/lightswitch" target="_blank">LightSwitch</a>, i Beta og det ser  ret cool ud mht. at kunne lave nogle apps hurtigt, med en standard brugergrænseflade.</p>
<p>Her til aften fik jeg så prøvet, at lave et <a title="Visual Studio LightSwitch" href="http://www.microsoft.com/visualstudio/en-us/lightswitch" target="_blank">LightSwitch</a> projekt &#8211; og er du gal mand! Det var så nemt, at jeg var nødt til lige, at lave en screencast på de mine første 5 minutters erfaringer med <a title="Visual Studio LightSwitch" href="http://www.microsoft.com/visualstudio/en-us/lightswitch" target="_blank">LightSwitch</a>, det er ret smart!</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="589" height="467" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/LRBTFrkQgp8?fs=1&amp;hl=da_DK&amp;rel=0" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="589" height="467" src="http://www.youtube.com/v/LRBTFrkQgp8?fs=1&amp;hl=da_DK&amp;rel=0" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Se det lidt i forhold til webudvikling, så appellerer LightSwitch helt klart til fx indtastningsopgaver, som kan udføres meget tidligere, da brugergrænsefladen kan laves på meget kort tid og ellers er det oplagt til:</p>
<ul>
<li><a title="Rapid Application Developement" href="http://en.wikipedia.org/wiki/Rapid_application_development" target="_blank">RAD (Rapid Application Development)</a></li>
<li><a title="Prototype" href="http://en.wikipedia.org/wiki/Prototyping" target="_blank">Prototyping</a></li>
<li><a title="Proof of concept" href="http://en.wikipedia.org/wiki/Proof_of_concept" target="_blank">Proof of concept</a></li>
</ul>
<p>Jeg må personligt sige, jeg er meget overrasket over alle de ting, som jeg får foræret i forhold til, at skulle lave det i ASP.NET WebForm eller .NET WinForms, hvor denne type projekt i det hele taget er intelligent i forhold til dine data &#8211; FEDT!</p>
]]></content:encoded>
			<wfw:commentRss>http://websiteudvikler.dk/post/en-app-paa-under-5-min-med-visual-studio-lightswitch.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Composite C1 CMS går All In på en Free Open Source model</title>
		<link>http://websiteudvikler.dk/post/composite-c1-cms-gar-all-in-paa-en-free-open-source-model.html</link>
		<comments>http://websiteudvikler.dk/post/composite-c1-cms-gar-all-in-paa-en-free-open-source-model.html#comments</comments>
		<pubDate>Fri, 01 Oct 2010 06:22:46 +0000</pubDate>
		<dc:creator>Kevin Steffer</dc:creator>
				<category><![CDATA[Webudvikling]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[Composite]]></category>
		<category><![CDATA[Microsoft .NET]]></category>
		<category><![CDATA[Open Source]]></category>

		<guid isPermaLink="false">http://websiteudvikler.dk/?p=527</guid>
		<description><![CDATA[Jeg har snakket med Marcus Wendt fra Composite i dag, dagen efter annoncering af at Composite C1 nu er tilgængeligt som Free Open Sourcee - en meget interessant udvikling i CMS software.]]></description>
			<content:encoded><![CDATA[<p>Jeg fik nyheden d. 28 sept. i en invitation fra Microsoft til et Web-Partner møde, hvor jeg kunne se at Composite C1 var på programmet for at snakke om Composite C1 Open Source CMS.<br />
Jeg troede det var en fejl, at måske Umbraco havde meldt afbud og at Composite så skulle træde ind istedet, og så var programmet ikke lige blevet opdateret, jeg kunne ikke finde noget om det på www.composite.dk &#8211; men jeg tog fejl!</p>
<p>I går onsdag d. 29. sept. fik jeg så nyheden via @hanstosti&#8217;s <a href="http://twitter.com/#!/hanstosti/status/25885039164" target="_blank">tweet</a> og dermed Composites eget website, at deres C1 CMS nu var Free Open Source! Intet mindre. &#8220;Hold da kæft mand&#8221;, tænkte jeg, &#8220;de mener det sgu seriøst&#8221;.</p>
<p><a href="http://websiteudvikler.dk/post/composite-c1-cms-gar-all-in-paa-en-free-open-source-model.html#samtalen">Gå direkte til min samtale med Marcus Wendt<br />
</a><a href="http://compositec1.codeplex.com/" target="_blank">Download Composite C1</a></p>
<h2>Min historik med Composite</h2>
<p>Jeg havde tidligere læst på Computer World at <a href="http://www.computerworld.dk/art/51370/cms-direktoer-millionunderskud-var-planlagt" target="_blank">Composite havde lavet et rigtig dårligt resultat i 2007/2008</a>, men at det var planlagt. Da jeg læste det, tænkte jeg, &#8220;helt ærligt &#8211; noget skal de jo sige til pressen&#8221;. Noget tyder dog på, at det var planlagt.</p>
<p>I december 2009 får jeg via Microsofts website en en mail om at Composite C1 er i færd med at udvikle et helt nyt CMS baseret på Microsofts .NET 4.0.<br />
I april dumper der så en <a href="http://www.microsoft.com/casestudies/Case_Study_Detail.aspx?casestudyid=4000006833" target="_blank">Case Study på udviklingen af Composite C1 på .NET 4.0</a> for at anvendelse af det nye <a href="http://msdn.microsoft.com/en-us/library/dd460693.aspx" target="_blank">.NET Parallel Programming</a>.</p>
<p>Mit billede af Composite på det tidspunkt er, at de får bygget et monster fedt &#8220;state-of-the-art&#8221; CMS, men al den nye technologi, men jeg hører intet til hverken systemet, gode referencer eller noget &#8211; Composite ebber ud for mig.</p>
<p>Nu fik jeg så et chok i går og jeg fyrede på <a href="http://compositec1.codeplex.com/" target="_blank">http://compositec1.codeplex.com</a> for at download en kopi og se, hvad der var lagt ud som Free Open Source. Jeg unzippede og åbnede Visual Studio 2010 projektet og trykkede CTRL-F5 (start projekt uden debugging) &#8211; jeg blev meget overraskende mødet men en Composite install side og på under 5 min. var jeg logget på backend, men et demo site, som jeg kunne kigge lidt i.</p>
<p><a title="Composite C1 in 5 minutes by Website Udvikling, on Flickr" href="http://www.flickr.com/photos/48722739@N05/5039808206/"><img src="http://farm5.static.flickr.com/4146/5039808206_7be5e27d70.jpg" alt="Composite C1 in 5 minutes" width="500" height="385" /></a></p>
<p>Jeg blev så nysgerrig efter at finde ud af, hvad der har drevet Composite til, at frigive softwaren som Free Open Source, jeg burde squ ringe til dem og høre lidt mere til deres strategi bag det her.<br />
<a name="samtalen"></a></p>
<h2>Samtalen med Marcus Wendt fra Composite</h2>
<p>I dag fik jeg kontaktet Marcus Wendt fra Composite, som var med på at blive frittet lidt.</p>
<p>Bottom line er, at de går &#8220;all in&#8221; på en Free Open Source model, det er den samme version, som du kan få i Open Source som du kan købe dig garanti på i den kommercielle version, &#8220;og det er forskellen&#8221;, siger Marcus.</p>
<p>Jeg spørger lidt til, om deres koncept er bag det her, eller man har kopieret en god idé fra Umbraco eller andet. Marcus svarer nogen lunde med,</p>
<ul>
<li>Fuld Fri Open Source koncept</li>
<li>Fuld version af software, ikke noget med en skrabet pakke</li>
<li>Ingen vendor lock-in</li>
<li>Fuld frit tilgængelig dokumentation og video, screencast demo og eksempler</li>
<li>Hele pakken til fri benyttelse</li>
</ul>
<p>Jeg fik spurgte lidt til den kommercielle version og det eksisterende partner netværk og Marcus svarede nogen lunde med,</p>
<ul>
<li>Kommercielt version er den sammen som Open Source blot med garanti.</li>
<li>Mulighed for slutbruger support og automatisk opdatering via web-interface.</li>
<li>Partnere er nu i princippet alle som bidrager til at levere Composite løsninger og udvikle til løsningen, men der var dog en certificerings mulighed på vej, så man kunne få en Certified Composite et eller andet batch på sit website.</li>
<li>Det helt store fokus med Free Open Source modellen er, at få fat i udviklere og få engagement i softwaren</li>
<li>Features til udviklere skal være gratis, men være kommercielle til virksomhederne (red. uden udvikler kompetencer)</li>
<li>Fx Composite Blog-modul var i overvejelser, om det skulle være et kommercielt modul, men strategien sagde dem, at udviklere blogger også &#8211; så skal det være Free.</li>
<li>Packaging features (noget med, at man kan samle en masse ting fra et Composite site sammen til en pakke og distribuere det over på andre Composite sites) er også Free</li>
</ul>
<p>Jeg fik også spurgt til, hvilket markede de henvendte sig til og Marcus svarede nogen lunde med,</p>
<ul>
<li>Markedet er udviklere på internettet</li>
<li>Satsningen er volumen i kendskabsgraden samt produktets evner</li>
<li>Der skal fyres op for udvikler entutiasme</li>
<li>Composite består af 4 teknikere, 1 CEO og 1 bogholder samt et test-team i Ukraine, så det er lavet efter, hvordan udviklerne mente et CMS skulle være kontra, hvad en CMS sælger har af behov.</li>
<li>Udgangspunktet til et Composite CMS er et download og en evaluering på systemet kontra et salgsmøde, med sælgeren.</li>
<li>Produktets evner skal styre deres succes istedet for en sælgers.</li>
</ul>
<p>Så fik jeg drejet samtalen lidt over på, hvordan var de kommet på idéen om Free Open Source, hvor Marcus svar fortsatte nogen lunde sådan,</p>
<ul>
<li>Fra 1999 til version 3.x startede ud i et ASP og Com baseret system til 2007, hvor beslutningen om at migrere eller starte forfra i .NET skulle træffes. Valget blev fra scratch modellen med alle de erfaringer der lå i æsken. Det kostede rigtig mange penge at lave en version 1.0 og så kom krisen – alle opgaver blive måske til næste år, og der stod vi så.</li>
<li>Slut december 2009 blev de første tanker omkring Free Open Souce til</li>
<li>I maj 2010 med en version 1.3 blev det den sidste closed source release op på .NET 4 og siden da er vi gået i Open Source mode.</li>
<li>Kildekoden blev revurderet til et meget udvikler orienteret API – de sidste 4 måneder er der blevet refactor’et omkring namespaces og klasser etc. så det blev pakket fint ind.</li>
<li>Det er blevet prioriteret meget højt, at udvikleren får en god start oplevelse med systemet.</li>
<li>Der ventes på opdaterede version af Web Platform Installer, som endnu ikke understøtter .NET 4.0</li>
<li>WebMatrix er i beta, hvorfra man også har en fantastisk tilgang til at lave site site i Composite C1, men en installations pakke til WebMatrix, så der ventes også på at WebMatrix bliver released</li>
<li>Med Web Platform installer og WebMatrix burde der være grobund for at nå rigtige mange udviklere og med WebMatrix endda blot web-folk, med HTML kundskaber.</li>
</ul>
<p>Så fik jeg frittet Marcus om softwaren var udviklet i Danmark</p>
<p>Det er den! Primært udviklet af 3 personer i København og testet af et team i Ukraine.<br />
At udvikle et system, som man som udvikler af selv gerne vil udvikle videre på kan ikke bare udvikles med ved at outsource den opgave &#8211; der ligger rigtig meget nerve og engagement, som gør at produktet i dag har den kaliber, siger Marcus.</p>
<p>Til sidst gik snakken over i nogle af mine spørgsmål omkring selve systemet, hvor vi kom ind på lidt arkitektur omkring af de datatyper der blev lavet i Composite blev til rigtig CLR typer, som der selvfølge kan arbejdes videre med i systemet, men jeg skal spare dig for de nørdede detaljer for nu.</p>
<p>Tusind tak, Marcus, for en snak som imponerede mig endnu mere end nyheden i sig selv gjorde. Fedt at du lige have tiden til det!</p>
<p>Jeg vil prøve at dykke med i systemet og finde ud af, om det er til at arbejde med &#8211; det skal du sikkert nok høre mere om.</p>
<p>Håber du fik, ligesom jeg, en uddybende forståelse for, hvorfor Composite har udgivet C1 som Free Open Source, hvor de i følge Marcus står i markedet og er på vej hen. Det efterlader om ikke andet så måske en masse spørgsmål til de øvrige CMS leverandører vi arbejder med.</p>
]]></content:encoded>
			<wfw:commentRss>http://websiteudvikler.dk/post/composite-c1-cms-gar-all-in-paa-en-free-open-source-model.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Åbent &#8220;brev&#8221;/blogindlæg til Dynamicweb eCommerce Team</title>
		<link>http://websiteudvikler.dk/post/abent-brev-blogindlaeg-til-dynamicweb-ecommerce-team.html</link>
		<comments>http://websiteudvikler.dk/post/abent-brev-blogindlaeg-til-dynamicweb-ecommerce-team.html#comments</comments>
		<pubDate>Mon, 31 May 2010 18:47:18 +0000</pubDate>
		<dc:creator>Kevin Steffer</dc:creator>
				<category><![CDATA[Integration]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Dynamicweb]]></category>
		<category><![CDATA[Ecommerce]]></category>
		<category><![CDATA[Microsoft .NET]]></category>

		<guid isPermaLink="false">http://websiteudvikler.dk/?p=458</guid>
		<description><![CDATA[I mit forsøg på at få Dynamicweb til at forstå, at de skal pleje webudviklere noget mere, og skabe nogle bedre forudsætninger for samarbejde med Dynamicweb, så vi undgår, at alle partnere programmere de samme features, moduler osv. er jeg nu nået endnu et skridt i den rigtige retning.
Se en demo på et integrations modul til E-conomic og læs om, hvorfor jeg viser en demo af modulet.]]></description>
			<content:encoded><![CDATA[<p>I mit forsøg på at få <a href="http://www.dynamicweb.dk" target="_blank">Dynamicweb</a> til at forstå, at de skal pleje webudviklere noget mere, og skabe nogle bedre forudsætninger for samarbejde med Dynamicweb, så vi undgår, at alle partnere programmere de samme features, moduler osv. er jeg nu nået endnu et skridt i den rigtige retning.</p>
<p><strong>Opfordring</strong>: Er du webudvikler og Dynamicweb Partner så lad mig høre om din mening til mine tanker om at Dynamicweb burde starte et udvikler community som fx <a href="http://sourceforge.net/" target="_blank">SourceForge</a>, <a href="http://www.codeplex.com" target="_blank">Codeplex</a>, <a href="http://www.stackoverflow.com" target="_blank">StackOverflow</a> etc..</p>
<p>I denne omgang startede det med, at jeg fik en henvendelse fra <a href="http://dk.linkedin.com/in/mortensnedker" target="_blank">Morten Snedker</a> for nogle uger siden, som gik på, at vi havde lavet integration mellem <a href="http://www.dynamicweb.dk/eCommerce-28807.aspx" target="_blank">Dynamicweb eCommerce</a> og<a href="http://www.e-conomic.dk" target="_blank"> e-conomic</a>. E-conomic er et online webbaseret regnskabsprogram, og vi har et par kunder, som har anvendt e-conomic i flere år, og har fulgt udviklingen af <a href="http://www.e-conomic.com/accountingsoftware/addons/api" target="_blank">e-conomics API</a> siden start.</p>
<h2>Dynamicweb eCommerce API Workshoppen gav mig et hint</h2>
<p>På workshoppen var vi inde på at snakke om, hvad Dynamicweb kunne gøre for os webudviklere. Jeg nævnte, som jeg også skrev i en <a title="Nyt fra workshoppen Dynamicweb eCommerce API" href="http://websiteudvikler.dk/post/nyt-fra-workshoppen-dynamicweb-ecommerce-api.html" target="_self">tidligere  blogpost</a>, at jeg synes, de burde åbne deres udvikling mere op, så vi kunne få et sparringsnetværk på benene, hvor vi kunne være med i processen og bidrage til udviklingen af systemet, moduler og features, hvilket er en stor styrke i udviklingen af software på platforme som bl.a. SourceForge og Codeplex.</p>
<h2>Integrationsmodulet mellem Dynamicweb eCommerce og E-conomic</h2>
<p>Mortens henvendelse gik på, at Dynamicweb ville igang med at udvikle et integrationsmodul til E-conomic, og at han lige ville høre lidt om vores erfaringer med det, da vi står på E-conomics website som integrationspartner. Jeg fik givet Morten lidt input og så kom det fra en klar himmel, nu har jeg muligheden for at vise dem, hvad det er jeg mener med hele det koncept jeg savner om, at få åbnet deres udvikling op.</p>
<p>Jeg skrev til Morten, at vi har lavet et modul til integration mellem Dynamicweb eCommerce og E-conomic i ny version baseret på .NET 3.5/4 og Dynamicweb 7, om det ikke ville give mening, at de tog et kig på vores idéer. &#8211; Så ringede <a title="Tobias Høst" href="http://dk.linkedin.com/pub/tobias-h%C3%B8st/3/139/9b0" target="_blank">Tobias</a> (Commercial Lead på Dynamicweb eCommerce) og vi fik en snak om situationen og blev enige om, at jeg skulle prøve at demonstrere, det vi har lavet i form af en screencast.</p>
<h2>Modul demo på Dynamicweb eCommerce integration til E-conomic</h2>
<p>Du kan her se hele min demo &#8211; en demo i 6 kapitler á 5 min. varighed (pga. at det er lavet lidt hurtigt med <a href="http://www.jingproject.com/" target="_blank">Jing</a>)</p>
<h3>Kapitel 1<br />
Intro om modulets opbygning, indstillinger, lidt E-conomic opsætning</h3>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/Ies-IMiIO-M&amp;hl=da_DK&amp;fs=1&amp;rel=0" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube.com/v/Ies-IMiIO-M&amp;hl=da_DK&amp;fs=1&amp;rel=0" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<h3>Kapitel 2<br />
E-conomic Settings kontrolpanel, overførsel af varegrupper og varer, lave en ordre på vores vare</h3>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/9LDOF-lwpco&amp;hl=da_DK&amp;fs=1&amp;rel=0" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube.com/v/9LDOF-lwpco&amp;hl=da_DK&amp;fs=1&amp;rel=0" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<h3>Kapitel 3<br />
Overførsel af Dynamicweb ordre til E-conomic, intro til priser i E-conomic, opbygning af koden og extension modellen<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/pu4uQ7hoOv0&amp;hl=da_DK&amp;fs=1&amp;rel=0" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube.com/v/pu4uQ7hoOv0&amp;hl=da_DK&amp;fs=1&amp;rel=0" allowscriptaccess="always" allowfullscreen="true"></embed></object></h3>
<h3>Kapitel 4<br />
Gennemgang af OrderSync koden med debugger<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/CBJdjnlUD4k&amp;hl=da_DK&amp;fs=1&amp;rel=0" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube.com/v/CBJdjnlUD4k&amp;hl=da_DK&amp;fs=1&amp;rel=0" allowscriptaccess="always" allowfullscreen="true"></embed></object></h3>
<h3>Kapitel 5<br />
Demo af extenders på ProductSync<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/uC5sJq0aHuU&amp;hl=da_DK&amp;fs=1&amp;rel=0" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube.com/v/uC5sJq0aHuU&amp;hl=da_DK&amp;fs=1&amp;rel=0" allowscriptaccess="always" allowfullscreen="true"></embed></object></h3>
<h3>Kapitel 6<br />
Fortsættelse af demo af extenders på ProductSync og afrunding<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/f94RwNikilk&amp;hl=da_DK&amp;fs=1&amp;rel=0" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube.com/v/f94RwNikilk&amp;hl=da_DK&amp;fs=1&amp;rel=0" allowscriptaccess="always" allowfullscreen="true"></embed></object></h3>
<p>Hvad synes du, tror du ikke på at modulet ville kunne blive godt?</p>
<p>Et hvert output nedenfor er meget værdsat.</p>
<p>Med venlig hilsen<br />
Kevin Steffer</p>
]]></content:encoded>
			<wfw:commentRss>http://websiteudvikler.dk/post/abent-brev-blogindlaeg-til-dynamicweb-ecommerce-team.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Linq, Dataset, Recordset performance resultat</title>
		<link>http://websiteudvikler.dk/post/linq-dataset-recordset-performance-resultat.html</link>
		<comments>http://websiteudvikler.dk/post/linq-dataset-recordset-performance-resultat.html#comments</comments>
		<pubDate>Sat, 26 Dec 2009 20:42:31 +0000</pubDate>
		<dc:creator>Kevin Steffer</dc:creator>
				<category><![CDATA[Analyse]]></category>
		<category><![CDATA[Dataset]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[Microsoft .NET]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Recordset]]></category>

		<guid isPermaLink="false">http://blogs.co3.dk/kevinsteffer/post/linq-dataset-recordset-performance-resultat/</guid>
		<description><![CDATA[Jeg har i længere tid undret mig over en dårlig performance med anvendelse af LINQ, og nu er jeg gået på jagt efter synderen i tiden i databasen SQL Server. I denne første test jeg har lavet har jeg dog ikke fundet synderen, men stadig et interessant resultat, som bekræfter mig i, at du ikke [...]]]></description>
			<content:encoded><![CDATA[<p>Jeg har i længere tid undret mig over en dårlig performance med anvendelse af <a href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx" target="_blank">LINQ</a>, og nu er jeg gået på jagt efter synderen i tiden i databasen <a href="http://www.microsoft.com/SQL/default.mspx" target="_blank">SQL Server</a>.</p>
<p>I denne første test jeg har lavet har jeg dog ikke fundet synderen, men stadig et interessant resultat, som bekræfter mig i, at du ikke skal bruge et <a href="http://msdn.microsoft.com/en-us/library/system.data.dataset(VS.71).aspx" target="_blank">Dataset</a> som bliver indlæst med data fra en <a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldataadapter.aspx" target="_blank">SqlDataAdapter</a> med Fill metoden, og her kan du se hvorfor:</p>
<p><img src="http://spreadsheets.google.com/a/pro.co3.dk/oimg?key=0An3C8tmqCWSHdGVPRUdCWVFDZzB1V3ByUmlEVWpvLUE&amp;oid=1&amp;v=1261860309379" width="300" />&#160; <img src="http://spreadsheets.google.com/a/pro.co3.dk/oimg?key=0An3C8tmqCWSHdGVPRUdCWVFDZzB1V3ByUmlEVWpvLUE&amp;oid=2&amp;v=1261860545958" width="300" /> </p>
<p><img src="http://spreadsheets.google.com/a/pro.co3.dk/oimg?key=0An3C8tmqCWSHdGVPRUdCWVFDZzB1V3ByUmlEVWpvLUE&amp;oid=3&amp;v=1261860593529" width="300" />&#160; <img src="http://spreadsheets.google.com/a/pro.co3.dk/oimg?key=0An3C8tmqCWSHdGVPRUdCWVFDZzB1V3ByUmlEVWpvLUE&amp;oid=4&amp;v=1261860624910" width="300" /></p>
<p>Min test går i sin simpelhed ud på at læse 1.000, 10.000 og 100.000 rækker fra en simpel tabel og så måle, hvor lang tid det tager få de tre måder at hente data ud på fra en SQL Server.</p>
<h2>Konklusion</h2>
<p><strong>Recordset dobbelt så hurtigt til små database kørsler</strong></p>
<p>Ved små data mængder er LINQ ikke så hurtig som Recordset, men da tiden er så lav mærkes det ikke, hvis de er enkelte jobs, så det er reelt kun et problem, hvis du skal køre rigtig mange af disse små-jobs mod databasen så husk du er færdig på den halve tid med et Recordset.</p>
<p><strong>Dataset skal anvendes, hvor mange af de samme data skal anvendes alsidsigt</strong></p>
<p>Når der skal tælles, hvor mange rækker man har fået ud i et resultat, så må du bede til, at du ikke har anvendt Dataset metoden, det der trækker ned er helt klart at måden hvorpå man skal hive data ud for at få et Dataset ikke egner sig til små resultater, fordi man skal hente hele tabellen med en hel vildt masse egenskaber ud, og det tager bare tid.</p>
<p><strong>Med 10.000 rækker er både LINQ og Recordset over dobbelt så hurtige som Dataset.</strong></p>
<p>Når vi øger antallet af rækker med en faktor 10 til 10.000 rækker stiger test tiderne selvfølgelig, fordi databasen tager længere tid om at sende 10 gange så meget data, men overraskende meget synes jeg. LINQ metoden stiger med en faktor 4,5, Dataset metoden stiger med en faktor 10 og Recordset metoden stiger med en faktor 6,5.</p>
<p><strong>Med 100.000 rækker begynder LINQ at hale gevaldigt ind på Recordset.</strong></p>
<p>Når vi øver antallet af rækker yderligere med en faktor 10 til 100.000 rækker, ville jeg forvente samme stigningsgrad som før med fra 1.000 til 10.000, men nu stiger den endnu mere. LINQ metoden stiger med en faktor 8,7, Dataset metoden med en faktor 9 og Recordset metoden med en faktor 9,5.</p>
<p><a href="http://bit.ly/5JCsPq" target="_blank">Download Visual Studio 2008 Projektet</a></p>
<h2>Testsystem</h2>
<p>Hardware: Bærbar HP Elitebook, 3GB RAM, 2,53GHz Intel Core Duo, 32bit    <br />Software: Windows 7 32bit, SQL Server Express 2009, Visual Studio 2008 Professional Developer Web Server</p>
<h2>Testforløb</h2>
<p>Jeg har opdelt min test i 4 forløb og hver eneste forløb er kørt 10 gange på samme metode for så til sidst at få en gennemsnits tidsforbrug som toneangivende konklusion.</p>
<p><strong>LINQ måling metode</strong></p>
<pre class="code"><span style="color: blue">private void </span>DoLinqTest()
{
    <span style="color: #2b91af">DateTime </span>dtLinqStart = <span style="color: #2b91af">DateTime</span>.Now;
    <span style="color: blue">using </span>( DB.<span style="color: #2b91af">dbDataContext </span>db = <span style="color: blue">new </span>DB.<span style="color: #2b91af">dbDataContext</span>() )
    {
        <span style="color: green">// Execution code
</span>    }
    <span style="color: #2b91af">DateTime </span>dtLinqEnd = <span style="color: #2b91af">DateTime</span>.Now;
    lblLinqTime.Text = ( dtLinqEnd - dtLinqStart ).ToString();
}</pre>
<p><strong>Dataset måling metode</strong></p>
<p><a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="color: blue">private void </span>DoDataSetTest()
{
    <span style="color: #2b91af">DateTime </span>dtDsStart = <span style="color: #2b91af">DateTime</span>.Now;
    <span style="color: blue">using </span>( <span style="color: #2b91af">SqlConnection </span>dbCon = <span style="color: blue">new </span><span style="color: #2b91af">SqlConnection</span>( <span style="color: #2b91af">ConfigurationManager</span>.ConnectionStrings[ <span style="color: #a31515">&quot;dbConnectionString&quot; </span>].ConnectionString ) )
    {
        <span style="color: blue">using </span>( <span style="color: #2b91af">SqlDataAdapter </span>sqlAdap = <span style="color: blue">new </span><span style="color: #2b91af">SqlDataAdapter</span>( <span style="color: #a31515">&quot;SELECT * FROM item&quot;</span>, dbCon ) )
        {
            <span style="color: #2b91af">DataSet </span>ds = <span style="color: blue">new </span><span style="color: #2b91af">DataSet</span>();
            sqlAdap.Fill( ds );

            <span style="color: green">// Executing code
</span>        }
    }
    <span style="color: #2b91af">DateTime </span>dtDsEnd = <span style="color: #2b91af">DateTime</span>.Now;
    lblDsTime.Text = ( dtDsEnd - dtDsStart ).ToString();
}</pre>
<p><strong>Recordset måling metode</strong></p>
<pre class="code"><span style="color: blue">private void </span>DoRecordSetTest()
{
    <span style="color: #2b91af">DateTime </span>dtRsStart = <span style="color: #2b91af">DateTime</span>.Now;
    <span style="color: blue">using </span>( <span style="color: #2b91af">SqlConnection </span>dbCon = <span style="color: blue">new </span><span style="color: #2b91af">SqlConnection</span>( <span style="color: #2b91af">ConfigurationManager</span>.ConnectionStrings[ <span style="color: #a31515">&quot;dbConnectionString&quot; </span>].ConnectionString ) )
    {
        dbCon.Open();
        <span style="color: blue">using </span>( <span style="color: #2b91af">SqlCommand </span>sqlCmd = <span style="color: blue">new </span><span style="color: #2b91af">SqlCommand</span>( <span style="color: #a31515">&quot;SELECT * FROM item&quot;</span>, dbCon ) )
        {
            <span style="color: blue">using </span>( <span style="color: #2b91af">SqlDataReader </span>rs = sqlCmd.ExecuteReader() )
            {
                <span style="color: green">// Executing code
</span>            }
        }
    }

    <span style="color: #2b91af">DateTime </span>dtRsEnd = <span style="color: #2b91af">DateTime</span>.Now;
    lblRsTime.Text = ( dtRsEnd - dtRsStart ).ToString();
}</pre>
<p><a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a></p>
<h2>1. forløb</h2>
<p>En test som ses i <em>Testresultat Sheet: <strong>1000 List</strong></em> på at få 1000 database rækker ud som objekter af flg. type:</p>
<pre class="code"><span style="color: blue">public class </span><span style="color: #2b91af">item
</span>{
    <span style="color: blue">public int </span>Id { <span style="color: blue">get</span>; <span style="color: blue">set</span>; }
    <span style="color: blue">public string </span>Name { <span style="color: blue">get</span>; <span style="color: blue">set</span>; }
    <span style="color: blue">public string </span>Description { <span style="color: blue">get</span>; <span style="color: blue">set</span>; }
    <span style="color: blue">public </span><span style="color: #2b91af">DateTime </span>Date { <span style="color: blue">get</span>; <span style="color: blue">set</span>; }

    <span style="color: blue">public </span>item()
    {
    }

}</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><strong>Executing LINQ code:</strong></p>
<pre class="code"><span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">item</span>&gt; objItems = ( <span style="color: blue">from </span>itm <span style="color: blue">in </span>db.items
                        <span style="color: blue">select new </span><span style="color: #2b91af">item
                        </span>{
                          Id = itm.id,
                          Name = itm.name,
                          Description = itm.description,
                          Date = itm.date.Value
                        } ).ToList();</pre>
</p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><strong>Executing Dataset code:</strong></p>
<pre class="code"><span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">item</span>&gt; items = <span style="color: blue">new </span><span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">item</span>&gt;();
<span style="color: #2b91af">DataRow</span>[] drs = ds.Tables[ 0 ].Select();
<span style="color: blue">for </span>( <span style="color: blue">int </span>i = 0; i &lt; drs.Length; i++ )
{
    <span style="color: blue">object</span>[] dbFields = drs[ i ].ItemArray;
    <span style="color: #2b91af">item </span>itm = <span style="color: blue">new </span><span style="color: #2b91af">item</span>();
    itm.Id = ( <span style="color: blue">int </span>)dbFields[ 0 ];
    itm.Name = dbFields[ 1 ].ToString();
    itm.Description = dbFields[ 2 ].ToString();
    itm.Date = ( <span style="color: #2b91af">DateTime </span>)dbFields[ 3 ];
    items.Add( itm );
}</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><strong>Executing Recordset code:</strong></p>
<pre class="code"><span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">item</span>&gt; items = <span style="color: blue">new </span><span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">item</span>&gt;();
<span style="color: blue">while </span>( rs.Read() )
{
  <span style="color: #2b91af">item </span>itm = <span style="color: blue">new </span><span style="color: #2b91af">item</span>();
  itm.Id = rs.GetInt32( 0 );
  itm.Name = rs.GetString( 1 );
  itm.Description = rs.GetString( 2 );
  itm.Date = rs.GetDateTime( 3 );
  items.Add( itm );
}</pre>
<h2>2. forløb</h2>
<p>En test som ses i <em>Testresultat sheet: <strong>1000 Count</strong></em> på at få antallet af rækker ud på en database tabel med 1.000 rækker</p>
<p><strong>Executing LINQ code:</strong></p>
<pre class="code"><span style="color: blue">int </span>count = ( <span style="color: blue">from </span>itm <span style="color: blue">in </span>db.items
              <span style="color: blue">select new </span><span style="color: #2b91af">item
              </span>{
                Id = itm.id,
                Name = itm.name,
                Description = itm.description,
                Date = itm.date.Value
              } ).Count();</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><strong>Executing Dataset code:</strong></p>
<pre class="code"><span style="color: blue">int </span>count = ds.Tables[ 0 ].Rows.Count;</pre>
<p><a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a></p>
<p><strong>Executing Recordset code:</strong></p>
<pre class="code"><span style="color: blue">int </span>count = 0;
<span style="color: blue">while </span>( rs.Read() )
{
    count++;
}</pre>
<h2>3. forløb</h2>
<p>En test som ses i <em>Testresultat sheet: <strong>10000 List</strong></em> med samme <em>Executing code</em> som 1. forløb, men denne gang på at få 10.000 database rækker ud.</p>
<h2>4. forløb</h2>
<p>En test som ses i <em>Testresultat sheet: <strong>100000 List</strong></em> med samme <em>Executing code</em> som 1. forløb, men denne gang på at få 100.000 database rækker ud.</p>
<p><a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a></p>
<h2>Testresultat</h2>
<p><iframe height="350" src="http://spreadsheets.google.com/pub?key=teOEGBYQCg0uWprRiDUjo-A&amp;output=html&amp;widget=true" frameborder="0" width="400"></iframe></p>
<p><a href="http://bit.ly/5JCsPq" target="_blank">Download Visual Studio 2008 Projektet</a></p>
]]></content:encoded>
			<wfw:commentRss>http://websiteudvikler.dk/post/linq-dataset-recordset-performance-resultat.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Managed Extensibility Framework</title>
		<link>http://websiteudvikler.dk/post/managed-extensibility-framework.html</link>
		<comments>http://websiteudvikler.dk/post/managed-extensibility-framework.html#comments</comments>
		<pubDate>Fri, 06 Nov 2009 20:15:44 +0000</pubDate>
		<dc:creator>Kevin Steffer</dc:creator>
				<category><![CDATA[Webudvikling]]></category>
		<category><![CDATA[Microsoft .NET]]></category>

		<guid isPermaLink="false">http://blogs.co3.dk/KevinSteffer/post.aspx?id=0a0f9e62-6b4f-46b4-81cc-b708c5fc916b</guid>
		<description><![CDATA[MEF som er en del af det kommende .NET Framework 4 Efter bare at have set nedenstående video har jeg helt klart fået det indtryk at når vi skal bygge webløsninger med en agil projektform, hvor vi ingen eller ringe kravspecifikation har, og bare skal bygge oven på og oven på, så er MEF nærmest [...]]]></description>
			<content:encoded><![CDATA[<p>MEF som er en del af det kommende .NET Framework 4 </p>
<p><img style="margin: 0px 10px 2px 0px; display: inline" title="blocks.png" alt="blocks.png" align="left" src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=MEF&amp;DownloadId=42484" width="78" height="97" />Efter bare at have set nedenstående video har jeg helt klart fået det indtryk at når vi skal bygge webløsninger med en agil projektform, hvor vi ingen eller ringe kravspecifikation har, og bare skal bygge oven på og oven på, så er MEF nærmest som kommet fra himlen og er klar til at velsigne de projekter som i dag er utrolig tunge og dyre at vedligeholde, fordi de er bygget af mange iterationer, hvor man ikke har haft en jordisk chance for i starten at tage højde for den udfordring man lige står og skal løse.</p>
<p>Med MEF er der håb forude!</p>
<p>Her er små 30 mins. introduktion i teknologien.</p>
<p><object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="318" height="238"><param name="source" value="http://channel9.msdn.com/App_Themes/default/vp09_06_22.xap" /><param name="initParams" value="m=http://mschnlnine.vo.llnwd.net/d1/ch9/7/7/7/7/7/4/104Episode26ManagedExtensibilityFramework_2MB_ch9.wmv,autostart=false,autohide=true,showembed=true, thumbnail=http://mschnlnine.vo.llnwd.net/d1/ch9/7/7/7/7/7/4/104Episode26ManagedExtensibilityFramework_large_ch9.png, postid=477777" /><param name="background" value="#00FFFFFF" /><a href="http://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;"> <img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none" /> </a> </object></p>
<p><a href="http://blogs.msdn.com/henrikwh/archive/2009/10/13/managed-extensibility-framework.aspx">Henrik W H : Managed Extensibility Framework</a></p>
]]></content:encoded>
			<wfw:commentRss>http://websiteudvikler.dk/post/managed-extensibility-framework.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://mschnlnine.vo.llnwd.net/d1/ch9/7/7/7/7/7/4/104Episode26ManagedExtensibilityFramework_2MB_ch9.wmv" length="26934827" type="video/x-ms-wmv" />
		</item>
		<item>
		<title>Microsoft Partner møde i Århus</title>
		<link>http://websiteudvikler.dk/post/microsoft-partner-moede-i-aarhus.html</link>
		<comments>http://websiteudvikler.dk/post/microsoft-partner-moede-i-aarhus.html#comments</comments>
		<pubDate>Wed, 21 Oct 2009 19:17:06 +0000</pubDate>
		<dc:creator>Kevin Steffer</dc:creator>
				<category><![CDATA[Webudvikling]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Microsoft .NET]]></category>

		<guid isPermaLink="false">http://blogs.co3.dk/KevinSteffer/post.aspx?id=9dd6b8b5-14c7-4d4b-bdfb-813c075f6839</guid>
		<description><![CDATA[Jeg var til partner møde i Århus for Microsofts Registrerede Partnere. Invitationen lød på, hvad Microsoft kan gøre for os, og hvordan bruger vi Microsoft bedre til at komme kundernes behov imøde. Ikke overraskende var over halvdelen af mødet om IT-Pro produkterne, Windows Server 2008, Small Business Server 2008, Essential Business Server 2008, Foundation Server [...]]]></description>
			<content:encoded><![CDATA[<p>Jeg var til partner møde i Århus for Microsofts Registrerede Partnere. Invitationen lød på, hvad Microsoft kan gøre for os, og hvordan bruger vi <a href="http://www.microsoft.dk" target="_blank">Microsoft</a> bedre til at komme kundernes behov imøde.</p>
<p>Ikke overraskende var over halvdelen af mødet om IT-Pro produkterne, <a href="http://www.microsoft.com/windowsserver2008/en/us/default.aspx" target="_blank">Windows Server 2008</a>, <a href="http://www.microsoft.com/sbs/en/us/default.aspx" target="_blank">Small Business Server 2008</a>, <a href="http://www.microsoft.com/ebs/en/us/default.aspx" target="_blank">Essential Business Server 2008</a>, <a href="http://www.microsoft.com/windowsserver2008/en/us/foundation.aspx" target="_blank">Foundation Server 2008</a> samt lidt omkring <a href="http://www.microsoft.com/exchange/2010/en/us/default.aspx" target="_blank">Exchange</a>, <a href="http://sharepoint.microsoft.com/Pages/Default.aspx" target="_blank">Sharepoint</a> og <a href="http://www.google.com/search?client=safari&amp;rls=en&amp;q=Windows+Management&amp;ie=UTF-8&amp;oe=UTF-8" target="_blank">management serien</a>. Ingen tvivl om, at det lyder til, at være nogle rigtig gode produkter for de små og mellemstore virksomheder (SMVere) fra 5 brugere til 250 brugere. De er udbygget, så man som administrator arbejder med wizards og skal ikke lære alt om produkterne før end de kan administreres i det daglige. Certificering i produkterne kan også udføres på under én uge inklusiv eksamen, og i følge Microsoft er der virkelig noget at hente, når virksomheden kan bruge <a href="https://partner.microsoft.com/40021562" target="_blank">Small Business Specialist</a> logo’et. Så det bliver der satset lidt på fra Microsofts side, på at få ført ud i partner netværket.</p>
<p>På programmet var der også nævnt nogle tilbud til Web partnere og <a href="http://www.google.com/search?client=safari&amp;rls=en&amp;q=Microsoft+ISV+partner+program&amp;ie=UTF-8&amp;oe=UTF-8" target="_blank">ISVere</a>, hvilket var årsagen til, at jeg var taget til mødet. Men det var sparsomt med info omkring <a href="http://www.microsoft.com/web/websitespark/" target="_blank">WebsiteSpark</a> og <a href="https://partner.microsoft.com/danmark/40087058" target="_blank">BizSpark</a>. Dog havde <a href="http://www.linkedin.com/in/musaeus" target="_blank">Rebekka</a> (<a href="https://partner.microsoft.com/" target="_blank">Microsoft Partner Network</a> Lead) i starten nogle ret centrale informationer omkring hjælp til os partnere, som er kørt fast eller har særlige behov, så det var helt vildt godt, at få på plads, at vi reelt kan trække på ressourcer hos Micosoft Regionale Service Center samt hos <a href="http://www.linkedin.com/pub/jes-allersted/2/a52/9a5" target="_blank">Jes Allersted</a> og Rebekka – fedt, de kommer til at høre fra mig i den nærmeste fremtid <img src='http://websiteudvikler.dk/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>2/3 henne i mødet kom <a href="http://www.linkedin.com/pub/henrik-westergaard-hansen/1/735/549" target="_blank">Henrik Westergard Hansen</a> på med info til ISVere og mindre udviklingshuse herunden også web. Og Henriks baggrund er fra <a href="http://msdn.microsoft.com" target="_blank">Microsoft Developer Network</a> og han var vildt god. Han kom rundt omkring i Cloud Computing, <a href="http://www.microsoft.com/windowsazure/" target="_blank">Windows Azure</a> og alle de nye forkortelser</p>
<ul>
<li>IaaS, Infrastructure as a Service</li>
<li>PaaS, Platform as a Service </li>
<li>SaaS, Software as Service</li>
<li>S+S, Software plus Service</li>
</ul>
<p>Hvor langt er disse temaer fra den virkelige verden? DE ER DER! </p>
<p>Har du mulighed for det så tag til <a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032427786&amp;culture=da-dk" target="_blank">Microsoft Partner Update i københavn</a> d. 29. oktober.</p>
<p>Se min tidligere indlæg på Windows Azure</p>
<ul>
<li><a href="http://blog.co3.dk/Kevin%20Steffer/post/Windows-Azure-eksempel-paring3b-SQL-Service.aspx">Windows Azure eksempel på SQL Service</a></li>
<li><a href="http://blog.co3.dk/Kevin%20Steffer/post/Windows-Azure-et-Microsoft-online-offensiv.aspx">Windows Azure et Microsoft online offensiv</a></li>
</ul>
<p>Henrik fortalte også, at der arbejdes på en flatrate afregningsmodel. Det er ikke uinteressant, når kunder skal konverteres fra traditionel platform til Windows Azure, fordi det afregningsmæssigt vil minde om en hosted løsning. Prismodellen for de eksisterende services blev også fremlagt, og minder meget om priserne hos konkurrenten <a href="http://aws.amazon.com" target="_blank">Amazon Web Services</a></p>
<p>Konklusionen er at der var helt sikkert noget at hente for os hos Microsoft efter de nu kommer ud af busken og henvender sig direkte til os. Så det samarbejde ser jeg helt klart lyst på og kan have et stort potentiale for os som webbureau som tidligere har været meget overladt til os selv med at finde informationer på de internationale Microsoft portaler.</p>
<p>Jeg sidder helt klart med en fornemmelse om, at Microsofts udmelding om, at de vil være mere åbne, og også gå mere direkte på partnere for at få dem sparket igang, ser ud til at fungere og virker helt vildt positivt på mit billede af Microsoft, – jeg glæder mig til at se, hvor vi står med Microsoft om et år eller to.</p>
<p>Links</p>
<ul>
<li><a href="http://www.microsoft.dk/partner">http://www.microsoft.dk/partner</a></li>
<li><a href="http://blogs.msdn.com/henrikwh/">http://blogs.msdn.com/henrikwh/</a></li>
<li><a href="http://twitter.com/henrikwh">http://twitter.com/henrikwh</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://websiteudvikler.dk/post/microsoft-partner-moede-i-aarhus.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows Azure eksempel på SQL Service</title>
		<link>http://websiteudvikler.dk/post/windows-azure-eksempel-paring-sql-service.html</link>
		<comments>http://websiteudvikler.dk/post/windows-azure-eksempel-paring-sql-service.html#comments</comments>
		<pubDate>Mon, 24 Nov 2008 20:39:33 +0000</pubDate>
		<dc:creator>Kevin Steffer</dc:creator>
				<category><![CDATA[Webudvikling]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Microsoft .NET]]></category>
		<category><![CDATA[SQL Azure]]></category>

		<guid isPermaLink="false">http://blogs.co3.dk/KevinSteffer/post.aspx?id=b9756c88-a598-4820-a139-d3795cf8854c</guid>
		<description><![CDATA[Jeg har afpr&#248;vet Windows Azure SQL Services med succes. Og jeg vil pr&#248;ve at demonstrere tilgangen med nogle kode eksempler, men overordnet er min oplevelse at det minder lidt om at arbdejde Db4o. Db4o er en &#34;Database For Objects&#34;, og er bygget op omkring at databasen er fil p&#229; filsystemet som der arbejdes med gennem [...]]]></description>
			<content:encoded><![CDATA[<p>Jeg har afpr&#248;vet <a href="http://azure.com/">Windows Azure</a> <a target="_blank" href="http://www.microsoft.com/azure/sql.mspx">SQL Services</a> med succes. Og jeg vil pr&#248;ve at demonstrere tilgangen med nogle kode eksempler, men overordnet er min oplevelse at det minder lidt om at arbdejde <a target="_blank" href="http://www.db4o.com/">Db4o</a>. <a target="_blank" href="http://www.db4o.com/">Db4o</a> er en &quot;Database For Objects&quot;, og er bygget op omkring at databasen er fil p&#229; filsystemet som der arbejdes med gennem databasesystemets <a target="_blank" href="http://da.wikipedia.org/wiki/API">API</a>. Et eksempel p&#229; hvordan <a target="_blank" href="http://www.db4o.com/">Db4o</a> kan bruges:</p>
<h2>(<a target="_blank" href="http://www.db4o.com/">Db4o</a>) &#197;bn database</h2>
<p>&#160;</p>
<div class="csharpcode">
<pre><span class="lnum">   1:  </span><span class="rem">// accessDb4o</span></pre>
<pre><span class="lnum">   2:  </span>&#160;</pre>
<pre><span class="lnum">   3:  </span>   ObjectContainer db=Db4o.openFile(Util.DB4OFILENAME);</pre>
<pre><span class="lnum">   4:  </span>   <span class="kwrd">try</span> {</pre>
<pre><span class="lnum">   5:  </span>       <span class="rem">// do something with db4o</span></pre>
<pre><span class="lnum">   6:  </span>   }</pre>
<pre><span class="lnum">   7:  </span>   <span class="kwrd">finally</span> {</pre>
<pre><span class="lnum">   8:  </span>       db.close(); </pre>
<pre><span class="lnum">   9:  </span>   }</pre>
</div>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<h2>(<a target="_blank" href="http://www.db4o.com/">Db4o</a>) Gem et objekt</h2>
<p>&#160;</p>
<div class="csharpcode">
<pre><span class="lnum">   1:  </span><span class="rem">// storeFirstPilot </span></pre>
<pre><span class="lnum">   2:  </span>&#160;</pre>
<pre><span class="lnum">   3:  </span>   Pilot pilot1=<span class="kwrd">new</span> Pilot(<span class="str">&quot;Michael Schumacher&quot;</span>,100);</pre>
<pre><span class="lnum">   4:  </span>   db.set(pilot1); </pre>
<pre><span class="lnum">   5:  </span>   System.<span class="kwrd">out</span>.println(<span class="str">&quot;Stored &quot;</span>+pilot1);</pre>
<pre><span class="lnum">   6:  </span>&#160;</pre>
<pre><span class="lnum">   7:  </span>    OUTPUT: </pre>
<pre><span class="lnum">   8:  </span>       Stored Michael Schumacher/100</pre>
</div>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<h2>(<a target="_blank" href="http://www.db4o.com/">Db4o</a>) Foresp&#248;rgsel</h2>
<p>&#160;</p>
<div class="csharpcode">
<pre><span class="lnum">   1:  </span><span class="rem">// retrieveAllPilotQBE </span></pre>
<pre><span class="lnum">   2:  </span>   </pre>
<pre><span class="lnum">   3:  </span>   Pilot proto=<span class="kwrd">new</span> Pilot(<span class="kwrd">null</span>,0);</pre>
<pre><span class="lnum">   4:  </span>   ObjectSet result=db.get(proto);</pre>
</div>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>&#160;</p>
<p>Ser vi n&#230;rmere p&#229; hvordan <a target="_blank" href="http://azure.com/">Windows Azure</a> <a target="_blank" href="http://www.microsoft.com/azure/sql.mspx">SQL Services</a> kan bruges her i mit eksempel via <a target="_blank" href="http://en.wikipedia.org/wiki/SOAP_(protocol)">SOAP</a>:</p>
<h2>(<a target="_blank" href="http://azure.com/">Azure</a>) &#197;bn database, betegnes som Container, og gem et objekt.</h2>
<pre class="code"><span style="color: blue">public void </span>Save()
{
    <span style="color: blue">using </span>(<span style="color: #2b91af">SitkaSoapServiceClient </span>s = <span style="color: blue">new </span><span style="color: #2b91af">SitkaSoapServiceClient</span>(<span style="color: #a31515">&quot;BasicAuthEndpoint&quot;</span>))
    {
        s.ClientCredentials.UserName.UserName = <span style="color: #2b91af">ConfigurationManager</span>.AppSettings[<span style="color: #a31515">&quot;sdsUsername&quot;</span>];
        s.ClientCredentials.UserName.Password = <span style="color: #2b91af">ConfigurationManager</span>.AppSettings[<span style="color: #a31515">&quot;sdsPassword&quot;</span>];

        <span style="color: #2b91af">Scope </span>objScope = <span style="color: blue">new </span><span style="color: #2b91af">Scope</span>();
        objScope.AuthorityId = AuthorityId;                       <span style="color: green">// My solution name
        </span>objScope.ContainerId = ContainerId;                       <span style="color: green">// The id of the container
        </span><span style="color: #2b91af">Entity </span>objSupportEntity = <span style="color: blue">new </span><span style="color: #2b91af">Entity</span>();
        objSupportEntity.Id = <span style="color: blue">this</span>.Id;                            <span style="color: green">// Unique id of my entity
        </span>objSupportEntity.Kind = <span style="color: blue">this</span>.GetType().ToString();        <span style="color: green">// Name of the Kind
        </span>objSupportEntity.Properties = <span style="color: blue">this</span>.GetDictFromThis();     <span style="color: green">// Properties a Dictionary

        </span>s.Create(objScope, objSupportEntity);                     <span style="color: green">// Save the entity into the container

    </span>}
}</pre>
<pre class="code"><span style="color: blue">private </span><span style="color: #2b91af">Dictionary</span>&lt;<span style="color: blue">string</span>, <span style="color: blue">object</span>&gt; GetDictFromThis()
{
    <span style="color: #2b91af">Dictionary</span>&lt;<span style="color: blue">string</span>, <span style="color: blue">object</span>&gt; obj = <span style="color: blue">new </span><span style="color: #2b91af">Dictionary</span>&lt;<span style="color: blue">string</span>, <span style="color: blue">object</span>&gt;();
    obj[<span style="color: #a31515">&quot;Id&quot;</span>] = <span style="color: blue">this</span>.Id;
    obj[<span style="color: #a31515">&quot;Subject&quot;</span>] = <span style="color: blue">this</span>.Subject;
    obj[<span style="color: #a31515">&quot;Message&quot;</span>] = <span style="color: blue">this</span>.Message;
    obj[<span style="color: #a31515">&quot;Date&quot;</span>] = <span style="color: blue">this</span>.Date;
    obj[<span style="color: #a31515">&quot;IsSolved&quot;</span>] = <span style="color: blue">this</span>.IsSolved;
    obj[<span style="color: #a31515">&quot;CreatedBy&quot;</span>] = <span style="color: blue">this</span>.CreatedBy;
    obj[<span style="color: #a31515">&quot;AssignedTo&quot;</span>] = <span style="color: blue">this</span>.AssignedTo;
    <span style="color: blue">return </span>(obj);
}</pre>
<p>Metoden GetDictFromThis kunne vi faktisk lave mere generisk hvis vi ville med <a target="_blank" href="http://msdn.microsoft.com/en-us/library/f7ykdhsy(VS.71).aspx">Reflections</a>.</p>
<h2>(<a target="_blank" href="http://azure.com/">Azure</a>) Foresp&#248;rgsel p&#229; alle entities i min container</h2>
<pre class="code"><span style="color: #2b91af">Scope </span>objScope = <span style="color: blue">new </span><span style="color: #2b91af">Scope</span>();
objScope.AuthorityId = AuthorityId;
objScope.ContainerId = ContainerId;
<span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">Entity</span>&gt; objEntities = s.Query(objScope, <span style="color: #a31515">&quot;from e in entities select e&quot;</span>);</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Scope objektet underst&#248;tter foresp&#248;rgsler i <a target="_blank" href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx">LINQ</a> og i min Service Reference Configuration til min <a target="_blank" href="http://www.microsoft.com/azure/sql.mspx">SQL Services</a> solution skal vi s&#230;tte &quot;Collection type&quot; til System.Collections.Generic.List da det er hvad <a target="_blank" href="http://www.microsoft.com/azure/sql.mspx">SQL Services</a> return&#233;rer.</p>
<p>Sammen lignet med <a target="_blank" href="http://www.db4o.com/">Db4o</a> er <a target="_blank" href="http://www.microsoft.com/azure/sql.mspx">SQL Services</a> lidt mere abstrakt og der rejser sig ogs&#229; hurtigt nogle h&#229;ndterings sp&#248;rgsm&#229;l i hovedet p&#229; mig: Hvordan styrer jeg hvilke entities der gemmes hvor og i det hele taget bevarer et overblik over min datastruktur? Godt nok har jeg attributen &quot;Kind&quot; p&#229; min Entity, men det er en string-v&#230;rdi og hvad sker der hvis den overskrives med en forkert &quot;Kind&quot;?</p>
<p>S&#229; der skal stadig planl&#230;gges en datastruktur hvor jeg i dette tilf&#230;lde synes der ville virke logisk at man styrer efter &quot;conventions over configuration&quot; s&#229; man bygger en ensartethed op i nogle base-klasser som ens objekters data kan styres med.</p>
<p>Hvis du vil se ovenst&#229;ende <a target="_blank" href="http://azure.com/">Windows Azure</a> <a target="_blank" href="http://www.microsoft.com/azure/sql.mspx">SQL Services</a> i aktion s&#229; hop ind p&#229; <a href="http://co3azurelab.co3.dk">http://co3azurelab.co3.dk</a>. Demo l&#248;sningen er t&#230;nkt som et mikro support-system hvor alle data gemmes i <a target="_blank" href="http://azure.com/">Windows Azure</a> <a target="_blank" href="http://www.microsoft.com/azure/sql.mspx">SQL Services</a> som vist ovenfor.</p>
<p>Demo: <a title="http://labs.co3.dk/azure/" href="http://labs.co3.dk/azure/">http://labs.co3.dk/azure/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://websiteudvikler.dk/post/windows-azure-eksempel-paring-sql-service.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dynamicweb modul-udvikling med LINQ</title>
		<link>http://websiteudvikler.dk/post/dynamicweb-modul-udvikling-med-linq.html</link>
		<comments>http://websiteudvikler.dk/post/dynamicweb-modul-udvikling-med-linq.html#comments</comments>
		<pubDate>Sat, 04 Oct 2008 19:28:06 +0000</pubDate>
		<dc:creator>Kevin Steffer</dc:creator>
				<category><![CDATA[Webudvikling]]></category>
		<category><![CDATA[Dynamicweb]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[Microsoft .NET]]></category>

		<guid isPermaLink="false">http://blogs.co3.dk/KevinSteffer/post.aspx?id=709ce0bf-9c46-4b90-8647-025d14504d7b</guid>
		<description><![CDATA[Efterh&#229;nden bruger jeg LINQ i al min udvikling og jeg synes ogs&#229; det vinder mere og mere indpas i&#160; min modul-udvikling til Dynamicweb. Og jeg vil her kort ind p&#229; hvad er LINQ er og give nogle eksempler og ogs&#229; lidt ind p&#229; hvorfor det er s&#229; dejligt at arbejde med. Introduktion til LINQ Lige [...]]]></description>
			<content:encoded><![CDATA[<p>Efterh&#229;nden bruger jeg <a target="_blank" href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx">LINQ</a> i al min udvikling og jeg synes ogs&#229; det vinder mere og mere indpas i&#160; min modul-udvikling til <a target="_blank" href="http://www.dynamicweb.dk">Dynamicweb</a>. Og jeg vil her kort ind p&#229; hvad er <a target="_blank" href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx">LINQ</a> er og give nogle eksempler og ogs&#229; lidt ind p&#229; hvorfor det er s&#229; dejligt at arbejde med.</p>
<h2>Introduktion til LINQ</h2>
<p>Lige for de som ikke lige har helt styr p&#229; hvad <a target="_blank" href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx">LINQ</a> er s&#229; er det kort fortalt en sprog-udvidelse til til kunne udtrykke <a target="_blank" href="http://en.wikipedia.org/wiki/Sql">SQL</a> lignende kode. </p>
<p>Her fx i <a target="_blank" href="http://msdn.microsoft.com/en-us/vcsharp/aa336809.aspx">C#</a> tr&#230;kker vi en liste af medarbejdere ud af en database tabel.</p>
<pre class="code"><span style="color: gray">/// </span><span style="color: green">CODE BLOCK 1</span><span style="color: #2b91af">IDbConnection </span>dwCon = Dynamicweb.<span style="color: #2b91af">Database</span>.GetConn(<span style="color: #a31515">&quot;Dynamicweb.mdb&quot;</span>);
<span style="color: #2b91af">List</span>&lt;DB.<span style="color: #2b91af">Medarbejdere</span>&gt; objMedarbejdere = <span style="color: blue">new </span><span style="color: #2b91af">List</span>&lt;DB.<span style="color: #2b91af">Medarbejdere</span>&gt;();
<span style="color: blue">using </span>(DB.<span style="color: #2b91af">DynamicwebDataContext </span>db = <span style="color: blue">new </span>DB.<span style="color: #2b91af">DynamicwebDataContext</span>(dwCon))
{
    objMedarbejdere = (<span style="color: blue">from </span>m <span style="color: blue">in </span>db.Medarbejderes
                       <span style="color: blue">orderby </span>m.Navn
                       <span style="color: blue">select </span>m).ToList();
}</pre>
<p><a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a></p>
<p>P&#229; almindelig vis skulle man skrive s&#229;dan:</p>
<pre class="code"><span style="color: gray">/// </span><span style="color: green">CODE BLOCK 2</span><span style="color: #2b91af">IDbConnection </span>dwCon = Dynamicweb.<span style="color: #2b91af">Database</span>.GetConn(<span style="color: #a31515">&quot;Dynamicweb.mdb&quot;</span>);
<span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">Medarbejder</span>&gt; objMedarbejdere = <span style="color: blue">new </span><span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">Medarbejder</span>&gt;();
<span style="color: blue">using </span>(<span style="color: #2b91af">IDataReader </span>rs = Dynamicweb.<span style="color: #2b91af">Database</span>.getDataReader(<span style="color: #a31515">&quot;SELECT * FROM Medarbejdere ORDER BY Navn&quot;</span>))
{
    <span style="color: blue">while </span>(rs.Read())
    {
        <span style="color: #2b91af">Medarbejder </span>objMedarbejder = <span style="color: blue">new </span><span style="color: #2b91af">Medarbejder</span>();
        objMedarbejder.Id = rs.GetInt32(0);
        objMedarbejder.Navn = rs.GetString(1);
        objMedarbejder.Adresse = rs.GetString(2);
        objMedarbejder.Postnr = rs.GetString(3);
        objMedarbejder.Bynavn = rs.GetString(4);
        objMedarbejder.Land = rs.GetString(5);

        objMedarbejdere.Add(objMedarbejder);
    }
}</pre>
<p><a href="http://11011.net/software/vspaste"></a><br />
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>Forinden skulle vi naturligvis have skrevet vores Medarbejder-klasse. Vi kan hurtig samle Medarbejder-objekter i en liste ved hj&#230;lp af generiske typer, meni det store hele er det noget tungt at skrive.</p>
<p><a target="_blank" href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx">LINQ</a> for&#230;rer os et klasse-agtigt interface til vores database og der sparer jeg utrolig meget tid til de m&#229;ske mange men simple database opgaver i mine projekter.</p>
<h2>Hvorfor LINQ er s&#229; dejlig at arbejde med</h2>
<p>F&#248;rst fordi du f&#229;r det her klasse-agtige interface til databasen for&#230;ret. N&#230;st efter kommer nok at det er lynhurtigt at foretage &#230;ndringer i tabellerne i databasen &#229;bne din DBML-fil og fjerne tabellen og s&#230;tte den ind igen og s&#229; n&#229;r man kompilerer koden f&#229;r man straks alle fejl frem hvor man skal have rettet anvendelsen af denne nye &#230;ndring. Jeg skriver dermed en meget mere sikker kode fordi compileren kan fort&#230;lle mig om mine fejl og derfor skal jeg ikke k&#248;re s&#229; meget test og s&#248;rge for alt mulig undtagelses-/exception-h&#229;ndtering.</p>
<p>Har man ikke lige f&#229;et sine data i den r&#230;kkef&#248;lge de skal bruges eller fx n&#229;r man skal bruge dem i flere r&#230;kkef&#248;lger og foretage flere filtreringer s&#229; er det ikke n&#248;dvendigt l&#230;ngere med nye database kald.<br />
  <br />I mit eksempel ovenfor hvor jeg tr&#230;kker en liste af medarbejdere ud af database har jeg sorteret dem p&#229; Navn. Hvis jeg lige pludselig skal bruge liste i Postnr orden kan jeg med <a target="_blank" href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx">LINQ</a> bare lige g&#248;re s&#229;dan her:</p>
<pre class="code"><span style="color: gray">/// </span><span style="color: green">CODE BLOCK 3</span><span style="color: #2b91af">List</span>&lt;DB.<span style="color: #2b91af">Medarbejdere</span>&gt; objEfterPostnr = objMedarbejdere.OrderBy(m =&gt; m.Postnr).ToList();</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Hvis jeg ikke ville have haft min list i en liste kunne jeg bare skrive:</p>
<pre class="code"><span style="color: gray">/// </span><span style="color: green">CODE BLOCK 4</span><span style="color: blue">var </span>objEfterPostnr = objMedarbejdere.OrderBy(m =&gt; m.Postnr);</pre>
<p><a href="http://11011.net/software/vspaste"></a>Hvis jeg s&#229; lige skal have et filter p&#229; fx landet s&#229; jeg kun sortere alle medarbejdere efter Postnr i Danmark skriver vi bare s&#229;dan her:</p>
<pre class="code"><span style="color: gray">/// </span><span style="color: green">CODE BLOCK 5</span><span style="color: blue">var </span>objEfterPostnr = objMedarbejdere.Where(m =&gt; m.Land.Equals(<span style="color: #a31515">&quot;Danmark&quot;</span>)).OrderBy(m =&gt; m.Postnr);</pre>
<p><a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a></p>
<p>Det er jo meget nemmere &#8211; hurtigere og mere sikkert end at skulle skrive &quot;CODE BLOCK 2&quot; hele fire gange.</p>
<p>Jeg kan kun opfordre dig til at pr&#248;ve om det er noget du kan vende dig til, jeg selv synes det er helt vildt besparende i tid at arbejde med, men det er ikke alt <a target="_blank" href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx">LINQ</a> er godt til fx den dynamiske del af <a target="_blank" href="http://en.wikipedia.org/wiki/Sql">SQL</a> hvor man parameter afh&#230;ngigt skaber dynamiske <a target="_blank" href="http://en.wikipedia.org/wiki/Sql">SQL</a>-s&#230;tning kan ikke lade sig g&#248;re. Det er jo godt rent sikkerhedsm&#230;ssigt pga. faren for at man ikke har sikret imod <a target="_blank" href="http://en.wikipedia.org/wiki/Sql">SQL</a>-Injection m.v. Men alligevel kunne det v&#230;re rart at have nogle redskaber ved h&#229;nden som kunne matche den dynamiske del af <a target="_blank" href="http://en.wikipedia.org/wiki/Sql">SQL</a> i programmeringen, m&#229;ske det kommer.</p>
<p>I <a target="_blank" href="http://www.dynamicweb.dk">Dynamicweb</a> bruger jeg <a target="_blank" href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx">LINQ</a> til 99% af al data behandling til og fra database. <a target="_blank" href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx">LINQ</a> er er ogs&#229; uhyre st&#230;rk ifm. opdatering af database fx INSERT, UPDATE, DELETE kommandoer kan g&#248;res uden du skal t&#230;nke s&#229; meget over det.</p>
<p>Her opdaterer jeg fx navnet p&#229; en medarbejder:</p>
<pre class="code"><span style="color: gray">/// </span><span style="color: green">CODE BLOCK 6</span><span style="color: blue">var </span>mig = objMedarbejdere.Where(m =&gt; m.Navn.Equals(<span style="color: #a31515">&quot;Kevin Steffer&quot;</span>)).Single();
mig.Navn = <span style="color: #a31515">&quot;Kevin Lind Steffer&quot;</span>;
db.SubmitChanges();</pre>
<p><a href="http://11011.net/software/vspaste"></a>Her opretter jeg en ny medarbejder:</p>
<pre class="code"><span style="color: gray">/// </span><span style="color: green">CODE BLOCK 7</span>DB.<span style="color: #2b91af">Medarbejdere </span>objMig = <span style="color: blue">new </span>DB.<span style="color: #2b91af">Medarbejdere</span>();
objMig.Navn = <span style="color: #a31515">&quot;Kevin Steffer&quot;</span>;
objMig.Adresse = <span style="color: #a31515">&quot;Str&#248;get 40&quot;</span>;
objMig.Postnr = <span style="color: #a31515">&quot;7430&quot;</span>;
objMig.Bynavn = <span style="color: #a31515">&quot;Ikast&quot;</span>;
objMig.Land = <span style="color: #a31515">&quot;Danmark&quot;</span>;
db.Medarbejderes.InsertOnSubmit(objMig);
db.SubmitChanges();</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Ikke noget med at jeg skal huske alle mulige sikkerhedstjek ved at k&#248;re et traditionelt dynamisk <a target="_blank" href="http://en.wikipedia.org/wiki/Sql">SQL</a> kald mod databasen, det styrer <a target="_blank" href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx">LINQ</a> for mig. <a target="_blank" href="http://www.dynamicweb.dk">Dynamicweb</a> har ogs&#229; funktioner der hj&#230;lper med at tjekke v&#230;rdier som skal ind i et dynamisk <a target="_blank" href="http://en.wikipedia.org/wiki/Sql">SQL</a> kald, men det bliver til rigtig mange kald og jeg kunne nemt overse et.</p>
<p>S&#229; jeg er afgjort hoppet p&#229; LINQ vognen og her lidt links til at komme igang</p>
<p><a href="http://www.hookedonlinq.com/">Hooked on LINQ<br />
    <br /></a><a href="http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx">101 LINQ Samples</a></p>
<p><a href="http://www.google.dk/search?rlz=1C1GGLS_daDK291&amp;sourceid=chrome&amp;ie=UTF-8&amp;q=linq">En Google</a></p>
<p>God form&#248;jelse med <a target="_blank" href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx">LINQ</a></p>
</p>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
]]></content:encoded>
			<wfw:commentRss>http://websiteudvikler.dk/post/dynamicweb-modul-udvikling-med-linq.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

