<?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>Schotime.net &#187; C#</title>
	<atom:link href="http://schotime.net/blog/index.php/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://schotime.net/blog</link>
	<description>All Things .Net and Me</description>
	<lastBuildDate>Sun, 20 Nov 2011 01:44:01 +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>Creating Your Own Glimpse Plugin</title>
		<link>http://schotime.net/blog/index.php/2011/05/10/creating-your-own-glimpse-plugin/</link>
		<comments>http://schotime.net/blog/index.php/2011/05/10/creating-your-own-glimpse-plugin/#comments</comments>
		<pubDate>Tue, 10 May 2011 11:02:00 +0000</pubDate>
		<dc:creator>Schotime</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Glimpse]]></category>

		<guid isPermaLink="false">http://schotime.net/blog/index.php/2011/05/10/creating-your-own-glimpse-plugin/</guid>
		<description><![CDATA[Last weekend I created a Glimpse plugin for PetaPoco. It was surprisingly easy. In this post I’ll show you how to create your own. Please note as Glimpse is still in Beta, this example may change. but I will endeavour to update the post when and if the interface changes. This plugin is based on [...]]]></description>
			<content:encoded><![CDATA[<p>Last weekend I created a <a href="http://getglimpse.com" target="_blank" onclick="pageTracker._trackPageview('/outgoing/getglimpse.com?referer=');">Glimpse</a> plugin for <a href="http://www.toptensoftware.com/petapoco/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.toptensoftware.com/petapoco/?referer=');">PetaPoco</a>. It was surprisingly easy. In this post I’ll show you how to create your own. </p>
<p><strong>Please note as Glimpse is still in Beta, this example may change. but I will endeavour to update the post when and if the interface changes. This plugin is based on Glimpse 0.81.</strong></p>
<p>Here is the complete code for our first plugin.</p>
<pre class="csharpcode">    [GlimpsePlugin(ShouldSetupInInit=true)]
    <span class="kwrd">public</span> <span class="kwrd">class</span> MyFirstGlimpsePlugin : IGlimpsePlugin
    {
        <span class="kwrd">private</span> <span class="kwrd">int</span> MaxValue;

        <span class="kwrd">public</span> <span class="kwrd">object</span> GetData(HttpApplication application)
        {
            <span class="rem">// Return the data you want to display on your tab</span>
            var data = <span class="kwrd">new</span> List&lt;<span class="kwrd">object</span>[]&gt; {<span class="kwrd">new</span>[]{ <span class="str">&quot;Column1&quot;</span>, <span class="str">&quot;Column2&quot;</span>, <span class="str">&quot;Column3&quot;</span> }};

            <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 0; i &lt; MaxValue; i++)
            {
                <span class="rem">// Usually get your data from application.Context.Items</span>
                data.Add(<span class="kwrd">new</span> <span class="kwrd">object</span>[] {<span class="str">&quot;Data &quot;</span> + i, 10*i, DateTime.Now.AddHours(i)});
            }

            <span class="kwrd">return</span> data;
        }

        <span class="kwrd">public</span> <span class="kwrd">void</span> SetupInit(HttpApplication application)
        {
            <span class="rem">// Perform an initialisation that needs to be done.</span>
            <span class="rem">// Run once at startup</span>
            MaxValue = 5;
        }

        <span class="kwrd">public</span> <span class="kwrd">string</span> Name
        {
            get { <span class="kwrd">return</span> <span class="str">&quot;MyFirstPlugin&quot;</span>; }
        }
    }</pre>
<p>There are three parts.<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>
<p>1. The Name get accessor: This is the name of the tab.<br />
  <br />2. SetupInit method: This method will run once when the Plugin is loaded. Perform any initialisation code here. </p>
<p>3. GetData method: This is where the action happens. All data returned from here will be serialized into JSON and sent to the client to be rendered by the Glimpse client side framework. How it is exactly rendered depends on whether you return arrays or objects or arrays of objects etc. Initial details for this can be found on the <a href="http://getglimpse.com/protocol" target="_blank" onclick="pageTracker._trackPageview('/outgoing/getglimpse.com/protocol?referer=');">Protocol page</a>. Usually you would put the data you need to display in the HttpContext.Items dictionary in part of your application. You can then pull the data out using the application variable provided to you in the GetData method.</p>
<p>For example<br />
  <br />-&gt; data goes in:&#160; HttpContext.Current.Items[“test”] = “Some data”; </p>
<p>-&gt; data comes out:&#160; var testdata = application.Context.Items[“test”]</p>
<p>The following is rendered by Glimpse.</p>
<p><a href="http://schotime.net/blog/wp-content/uploads/2011/05/GlimpsefirstPlugin.jpg" target="_blank" onclick="pageTracker._trackPageview('/outgoing/schotime.net/blog/wp-content/uploads/2011/05/GlimpsefirstPlugin.jpg?referer=');"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Glimpse-firstPlugin" border="0" alt="Glimpse-firstPlugin" src="http://schotime.net/blog/wp-content/uploads/2011/05/GlimpsefirstPlugin_thumb.jpg" width="611" height="342" /></a> </p>
<p>As you will see, it doesn’t matter what data you put in what column as Glimpse will do its best to render the data in the most approriate way. If I change the GetData method to be:</p>
<pre class="csharpcode">        <span class="kwrd">public</span> <span class="kwrd">object</span> GetData(HttpApplication application)
        {
            <span class="rem">// Return the data you want to display on your tab</span>
            var data = <span class="kwrd">new</span> List&lt;<span class="kwrd">object</span>[]&gt; {<span class="kwrd">new</span>[]{ <span class="str">&quot;Column1&quot;</span>, <span class="str">&quot;Column2&quot;</span>, <span class="str">&quot;Column3&quot;</span> }};

            <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 0; i &lt; MaxValue; i++)
            {
                <span class="rem">// Usually get your data from application.Context.Items</span>
                data.Add(<span class="kwrd">new</span> <span class="kwrd">object</span>[] {<span class="str">&quot;Data &quot;</span> + i, 10*i, DateTime.Now.AddHours(i)});
            }

            var nestedData = <span class="kwrd">new</span> Dictionary&lt;<span class="kwrd">string</span>, <span class="kwrd">object</span>&gt;
                                 {
                                     {<span class="str">&quot;NestKey1&quot;</span>, <span class="str">&quot;NestedValue&quot;</span>},
                                     {<span class="str">&quot;NestKey2&quot;</span>, 2 },
                                     {<span class="str">&quot;NestKey3&quot;</span>, DateTime.Now }
                                 };

            data.Add(<span class="kwrd">new</span> <span class="kwrd">object</span>[] { <span class="str">&quot;Data Nested&quot;</span>, 60, nestedData });

            <span class="kwrd">return</span> data;
        }</pre>
<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>the following is rendered by Glimpse.</p>
<p><a href="http://schotime.net/blog/wp-content/uploads/2011/05/GlimpsefirstPlugin2.jpg" target="_blank" onclick="pageTracker._trackPageview('/outgoing/schotime.net/blog/wp-content/uploads/2011/05/GlimpsefirstPlugin2.jpg?referer=');"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Glimpse-firstPlugin2" border="0" alt="Glimpse-firstPlugin2" src="http://schotime.net/blog/wp-content/uploads/2011/05/GlimpsefirstPlugin2_thumb.jpg" width="618" height="333" /></a> </p>
<p>As you can see the Glimpse team have made it super easy to create your own plugin. It literally takes minutes.</p>
<p>Enjoy<br />
  <br />Adam</p>
]]></content:encoded>
			<wfw:commentRss>http://schotime.net/blog/index.php/2011/05/10/creating-your-own-glimpse-plugin/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>A Glimpse into PetaPoco</title>
		<link>http://schotime.net/blog/index.php/2011/05/09/a-glimpse-into-petapoco/</link>
		<comments>http://schotime.net/blog/index.php/2011/05/09/a-glimpse-into-petapoco/#comments</comments>
		<pubDate>Mon, 09 May 2011 11:51:49 +0000</pubDate>
		<dc:creator>Schotime</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Glimpse]]></category>
		<category><![CDATA[PetaPoco]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://schotime.net/blog/index.php/2011/05/09/a-glimpse-into-petapoco/</guid>
		<description><![CDATA[Last week I blogged about upcoming performance statistics that enable you to see all the Sql’s that were executed by PetaPoco in the current request. It was also just over a week ago that I learned about Glimpse from this Mix video by Scott Hanselman. And wow what an impact. Anthony van der Hoorn (@anthony_vdh) [...]]]></description>
			<content:encoded><![CDATA[<p>Last week I <a href="http://schotime.net/blog/index.php/2011/05/03/petapoco-performance-statistics/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/schotime.net/blog/index.php/2011/05/03/petapoco-performance-statistics/?referer=');">blogged</a> about upcoming performance statistics that enable you to see all the Sql’s that were executed by <a href="http://www.toptensoftware.com/petapoco/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.toptensoftware.com/petapoco/?referer=');">PetaPoco</a> in the current request.</p>
<p>It was also just over a week ago that I learned about <a href="http://getglimpse.com" target="_blank" onclick="pageTracker._trackPageview('/outgoing/getglimpse.com?referer=');">Glimpse</a> from this <a href="http://channel9.msdn.com/Events/MIX/MIX11/FRM02" target="_blank" onclick="pageTracker._trackPageview('/outgoing/channel9.msdn.com/Events/MIX/MIX11/FRM02?referer=');">Mix video</a> by <a href="http://hanselman.com" target="_blank" onclick="pageTracker._trackPageview('/outgoing/hanselman.com?referer=');">Scott Hanselman</a>. And wow what an impact. <strong>Anthony van der Hoorn</strong> (<a href="http://twitter.com/anthony_vdh" onclick="pageTracker._trackPageview('/outgoing/twitter.com/anthony_vdh?referer=');">@anthony_vdh</a>) and <strong>Nik Molnar</strong> (<a href="http://twitter.com/nikmd23" onclick="pageTracker._trackPageview('/outgoing/twitter.com/nikmd23?referer=');">@nikmd23</a>) had created a wonderful diagnostics system for Asp.net MVC. Firebug for the server if you will.</p>
<p>I then wondered if I could somehow plug PetaPoco diagnostics into the display for Glimpse and it was unbelievably easy. Implementing a single interface was all it took. Less than 50 lines of code in total to produce the following results. I will show you how to create your own tab in a future post. <strong>Update</strong>: <a href="http://schotime.net/blog/index.php/2011/05/10/creating-your-own-glimpse-plugin/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/schotime.net/blog/index.php/2011/05/10/creating-your-own-glimpse-plugin/?referer=');">Creating Your Own Glimpse Plugin</a></p>
<p><a href="http://schotime.net/blog/wp-content/uploads/2011/05/petapoco_glimpse2.jpg" onclick="pageTracker._trackPageview('/outgoing/schotime.net/blog/wp-content/uploads/2011/05/petapoco_glimpse2.jpg?referer=');"><img style="display: inline; margin-left: 0px; margin-right: 0px; border-width: 0px;" title="petapoco_glimpse2" src="http://schotime.net/blog/wp-content/uploads/2011/05/petapoco_glimpse2_thumb.jpg" border="0" alt="petapoco_glimpse2" width="317" height="182" align="left" /></a></p>
<p>This gives a pretty clear display of exactly what queries were performed during the current request.</p>
<p>Another powerful feature of Glimpse is that it saves the last n (default 5) requests so it is indeed possible to get access to the Sql’s performed when posting data back to the server.</p>
<p>It really is a credit to the guys for a wonderful project which still hasn’t reached a V1.</p>
<p>My aim is to have both the integration to Glimpse and html source statistics available within the week but it all depends on whether the integration points make it into the main branch before hand.</p>
<p><strong>Update</strong> (01/06/2011): This is now available as a package from NuGet called PetaPoco.Glimpse.</p>
<p>Until then, check out <a href="http://getglimpse.com" target="_blank" onclick="pageTracker._trackPageview('/outgoing/getglimpse.com?referer=');">Glimpse</a> (on NuGet as well) and support it by providing valuable feedback to the team.</p>
<p>Adam</p>
]]></content:encoded>
			<wfw:commentRss>http://schotime.net/blog/index.php/2011/05/09/a-glimpse-into-petapoco/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Dynamic Dot Less Css With Asp.net MVC 2</title>
		<link>http://schotime.net/blog/index.php/2010/07/02/dynamic-dot-less-css-with-asp-net-mvc-2/</link>
		<comments>http://schotime.net/blog/index.php/2010/07/02/dynamic-dot-less-css-with-asp-net-mvc-2/#comments</comments>
		<pubDate>Thu, 01 Jul 2010 14:33:27 +0000</pubDate>
		<dc:creator>Schotime</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[dotLess]]></category>

		<guid isPermaLink="false">http://schotime.net/blog/index.php/2010/07/02/dynamic-dot-less-css-with-asp-net-mvc-2/</guid>
		<description><![CDATA[I have been having a look at the best way to theme a asp.net mvc website in the last few weeks. I heard about dot less css late last year but hadn’t had time to integrate it into a project until now. Integrating dot less css is pretty easy by default, as shown on its [...]]]></description>
			<content:encoded><![CDATA[<p>I have been having a look at the best way to theme a asp.net mvc website in the last few weeks. I heard about <a href="http://dotlesscss.com" target="_blank" onclick="pageTracker._trackPageview('/outgoing/dotlesscss.com?referer=');">dot less css</a> late last year but hadn’t had time to integrate it into a project until now. </p>
<p>Integrating dot less css is pretty easy by default, as shown on its home page however I wanted something that could be configured by application users. We want to be able to specify the link html tag like the following.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400"> 
<pre class="code"><span style="color: blue">&lt;</span><span style="color: #a31515">link </span><span style="color: red">href</span><span style="color: blue">=&quot;/public/css/sites.less&quot; </span><span style="color: red">rel</span><span style="color: blue">=&quot;stylesheet&quot; </span><span style="color: red">type</span><span style="color: blue">=&quot;text/css&quot; /&gt;</span></pre>
</td>
</tr>
</tbody>
</table>
<p>There are few steps involved in the solution I have come up with so bare with me as I go through them. Firstly we’ll start with the web.config:</p>
<table style="background: black" cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
        </p>
<pre class="code"><span style="background: black; color: white">        &lt;</span><span style="background: black; color: #cc7832">compilation</span><span style="background: black; color: white">&gt;
            &lt;</span><span style="background: black; color: #cc7832">buildProviders</span><span style="background: black; color: white">&gt;
                &lt;</span><span style="background: black; color: #cc7832">add </span><span style="background: black; color: white">extension=&quot;</span><span style="background: black; color: #a5c25c">.lessx</span><span style="background: black; color: white">&quot; type=&quot;</span><span style="background: black; color: #a5c25c">System.Web.Compilation.PageBuildProvider</span><span style="background: black; color: white">&quot; /&gt;
            &lt;/</span><span style="background: black; color: #cc7832">buildProviders</span><span style="background: black; color: white">&gt;
        &lt;/</span><span style="background: black; color: #cc7832">compilation</span><span style="background: black; color: white">&gt;</span></pre>
</td>
</tr>
</tbody>
</table>
<p>Insert the builderProviders block inside the compilation section. The compilation section will be under the system.web section. This will enable us to use code blocks in our lessx files.</p>
<p>Secondly, is the routing.</p>
<table style="background: black" cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
        </p>
<pre class="code"><span style="background: black; color: white">        </span><span style="background: black; color: gray">//Special Route for css so that images are relative to it
        </span><span style="background: black; color: white">routes.MapRoute(</span><span style="background: black; color: #a5c25c">&quot;css&quot;</span><span style="background: black; color: white">,
                           </span><span style="background: black; color: #a5c25c">&quot;public/css/{filename}.less&quot;</span><span style="background: black; color: white">,
                           </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: white">{ controller = </span><span style="background: black; color: #a5c25c">&quot;Css&quot;</span><span style="background: black; color: white">, action = </span><span style="background: black; color: #a5c25c">&quot;Index” </span><span style="background: black; color: white">},
                           </span><span style="background: black; color: #cc7832">new</span><span style="background: black; color: white">[] { </span><span style="background: black; color: #a5c25c">&quot;eLearning.Controllers&quot; </span><span style="background: black; color: white">});</span></pre>
</td>
</tr>
</tbody>
</table>
<p>This specifies that any url matching /public/css/{filename}.less should be routed to the CssController passing the filename as the parameter to the Index method.</p>
<table style="background: black" cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
        </p>
<pre class="code"><span style="background: black; color: white">    </span><span style="background: black; color: #cc7832">public class </span><span style="background: black; color: #ffc66d">CssController </span><span style="background: black; color: white">: </span><span style="background: black; color: #ffc66d">BaseController
    </span><span style="background: black; color: white">{
        [</span><span style="background: black; color: #ffc66d">OutputCache</span><span style="background: black; color: white">(Duration = </span><span style="background: black; color: #6897bb">10</span><span style="background: black; color: white">, VaryByParam = </span><span style="background: black; color: #a5c25c">&quot;&quot;</span><span style="background: black; color: white">)]
        </span><span style="background: black; color: #cc7832">public </span><span style="background: black; color: #ffc66d">ActionResult </span><span style="background: black; color: white">Index(</span><span style="background: black; color: #cc7832">string </span><span style="background: black; color: white">filename)
        {
            </span><span style="background: black; color: #cc7832">if </span><span style="background: black; color: white">(</span><span style="background: black; color: #cc7832">string</span><span style="background: black; color: white">.IsNullOrEmpty(filename))
                </span><span style="background: black; color: #cc7832">throw new </span><span style="background: black; color: #ffc66d">ArgumentException</span><span style="background: black; color: white">(</span><span style="background: black; color: #a5c25c">&quot;A filename must be supplied&quot;</span><span style="background: black; color: white">);

            ViewData[</span><span style="background: black; color: #a5c25c">&quot;baseColor&quot;</span><span style="background: black; color: white">] = </span><span style="background: black; color: #a5c25c">&quot;#aabbcc&quot;</span><span style="background: black; color: white">;

            </span><span style="background: black; color: #cc7832">var </span><span style="background: black; color: white">less = RenderViewToString(filename + </span><span style="background: black; color: #a5c25c">&quot;.lessx&quot;</span><span style="background: black; color: white">, </span><span style="background: black; color: #cc7832">null</span><span style="background: black; color: white">);
            </span><span style="background: black; color: #cc7832">var </span><span style="background: black; color: white">css = </span><span style="background: black; color: #ffc66d">LessCss</span><span style="background: black; color: white">.Generate(less, </span><span style="background: black; color: #cc7832">true</span><span style="background: black; color: white">);
            </span><span style="background: black; color: #cc7832">return </span><span style="background: black; color: white">Content(css, </span><span style="background: black; color: #a5c25c">&quot;text/css&quot;</span><span style="background: black; color: white">);
        }
    }

    </span><span style="background: black; color: #cc7832">public static class </span><span style="background: black; color: #ffc66d">LessCss
    </span><span style="background: black; color: white">{
        </span><span style="background: black; color: #cc7832">public static string </span><span style="background: black; color: white">Generate(</span><span style="background: black; color: #cc7832">string </span><span style="background: black; color: white">less, </span><span style="background: black; color: #cc7832">bool </span><span style="background: black; color: white">minify)
        {
            </span><span style="background: black; color: #cc7832">var </span><span style="background: black; color: white">lessEngine = </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: white">EngineFactory();
            lessEngine.Configuration.MinifyOutput = minify;
            </span><span style="background: black; color: #cc7832">var </span><span style="background: black; color: white">output = lessEngine.GetEngine().TransformToCss(less, </span><span style="background: black; color: #cc7832">null</span><span style="background: black; color: white">);
            </span><span style="background: black; color: #cc7832">return </span><span style="background: black; color: white">output;
        }
    }</span></pre>
</td>
</tr>
</tbody>
</table>
<p>This is the css controller class. It receives the filename as the input, finds the corresponding .lessx file and returns the file with appropriate view data replaced. Is then takes the less formatted string and runs it through the dot less parser to return a css string. This is then returned to the browser with the appropriate content-type. One method I have not shown is the RenderViewToString() and how the .lessx file is located. This method is located on the base controller class that the css controller inherits from. I have also turned Caching on so that it will cache the result for 10seconds.</p>
<table style="background: black" cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
        </p>
<pre class="code"><span style="background: black; color: white">        </span><span style="background: black; color: #cc7832">protected string </span><span style="background: black; color: white">RenderViewToString(</span><span style="background: black; color: #cc7832">string </span><span style="background: black; color: white">viewName, </span><span style="background: black; color: #cc7832">object </span><span style="background: black; color: white">model)
        {
            </span><span style="background: black; color: #cc7832">if </span><span style="background: black; color: white">(</span><span style="background: black; color: #cc7832">string</span><span style="background: black; color: white">.IsNullOrEmpty(viewName))
                viewName = ControllerContext.RouteData.GetRequiredString(</span><span style="background: black; color: #a5c25c">&quot;action&quot;</span><span style="background: black; color: white">);

            ViewData.Model = model;

            </span><span style="background: black; color: #cc7832">using </span><span style="background: black; color: white">(</span><span style="background: black; color: #ffc66d">StringWriter </span><span style="background: black; color: white">sw = </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">StringWriter</span><span style="background: black; color: white">())
            {
                </span><span style="background: black; color: #ffc66d">ViewEngineResult </span><span style="background: black; color: white">viewResult = </span><span style="background: black; color: #ffc66d">ViewEngines</span><span style="background: black; color: white">.Engines.FindView(ControllerContext, viewName, </span><span style="background: black; color: #cc7832">null</span><span style="background: black; color: white">);
                </span><span style="background: black; color: #ffc66d">ViewContext </span><span style="background: black; color: white">viewContext = </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">ViewContext</span><span style="background: black; color: white">(ControllerContext, viewResult.View, ViewData, TempData, sw);
                viewResult.View.Render(viewContext, sw);

                </span><span style="background: black; color: #cc7832">return </span><span style="background: black; color: white">sw.GetStringBuilder().ToString();
            }
        }</span></pre>
</td>
</tr>
</tbody>
</table>
<p>
  <br />This method finds the .lessx file and returns the result as a string. Now usually the view engine will take controller name and method name and by convention look in the /Views/css/index.aspx file. It doesn’t quite make sense to put it in the views folder so I have overridden the default web forms view engine so that they can be placed in the /Public/Css folder. This can be configured to your liking (convention).</p>
<table style="background: black" cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
        </p>
<pre class="code"><span style="background: black; color: white">    </span><span style="background: black; color: #cc7832">public class </span><span style="background: black; color: #ffc66d">CustomViewEngine </span><span style="background: black; color: white">: </span><span style="background: black; color: #ffc66d">WebFormViewEngine
    </span><span style="background: black; color: white">{
        </span><span style="background: black; color: #cc7832">public </span><span style="background: black; color: white">CustomViewEngine()
        {
            </span><span style="background: black; color: #cc7832">var </span><span style="background: black; color: white">locs = </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">List</span><span style="background: black; color: white">&lt;</span><span style="background: black; color: #cc7832">string</span><span style="background: black; color: white">&gt;(</span><span style="background: black; color: #cc7832">base</span><span style="background: black; color: white">.ViewLocationFormats);
            locs.Add(</span><span style="background: black; color: #a5c25c">&quot;~/Public/{1}/{0}&quot;</span><span style="background: black; color: white">); </span><span style="background: black; color: gray">//My personal choice
            </span><span style="background: black; color: white">locs.Add(</span><span style="background: black; color: #a5c25c">&quot;~/Views/{1}/{0}&quot;</span><span style="background: black; color: white">);  </span><span style="background: black; color: gray">//An alternative choice
            </span><span style="background: black; color: #cc7832">base</span><span style="background: black; color: white">.ViewLocationFormats = locs.ToArray();
        }
    }</span></pre>
</td>
</tr>
</tbody>
</table>
<p>Once your Custom View Engine has been overridden, you will need to add it to the ViewEngines.Engines collection in the application start method in the global.asax.cs.</p>
<table style="background: black" cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
        </p>
<pre class="code"><span style="background: black; color: white">        </span><span style="background: black; color: #ffc66d">ViewEngines</span><span style="background: black; color: white">.Engines.Clear();
        </span><span style="background: black; color: #ffc66d">ViewEngines</span><span style="background: black; color: white">.Engines.Add(</span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">CustomViewEngine</span><span style="background: black; color: white">());</span></pre>
</td>
</tr>
</tbody>
</table>
<p>This will then allow us to write a *.lessx file like the following; you can also pass a strongly typed model to the .lessx file if you so wish in the same way you would to a regular aspx view.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
        </p>
<pre class="code">&lt;%@ Page Language=&quot;C#&quot; Inherits=&quot;System.Web.Mvc.ViewPage&quot; %&gt;

@basecolor: &lt;%= ViewData[&quot;baseColor&quot;] %&gt;;

body {
    background: @basecolor;
}</pre>
</td>
</tr>
</tbody>
</table>
<p>Which will be rendered to the browser as:</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
        </p>
<pre class="code">body {
    background: #aabbcc;
}</pre>
</td>
</tr>
</tbody>
</table>
<p>And that’s it. I’m still working on the finer details but I am liking how it works at the moment. If you have any thoughts or suggestions, please leave a comment.</p>
<p>Adam</p>
]]></content:encoded>
			<wfw:commentRss>http://schotime.net/blog/index.php/2010/07/02/dynamic-dot-less-css-with-asp-net-mvc-2/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>NoRM, MongoDb and Complex Queries</title>
		<link>http://schotime.net/blog/index.php/2010/05/14/norm-mongodb-and-complex-queries/</link>
		<comments>http://schotime.net/blog/index.php/2010/05/14/norm-mongodb-and-complex-queries/#comments</comments>
		<pubDate>Fri, 14 May 2010 08:47:18 +0000</pubDate>
		<dc:creator>Schotime</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Linq]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[NoRM]]></category>

		<guid isPermaLink="false">http://schotime.net/blog/index.php/2010/05/14/norm-mongodb-and-complex-queries/</guid>
		<description><![CDATA[In my last post I told you about how you can use Regular Expressions to do complex queries in mongodb. In this post I will show you some more features of the Linq Provider. Updated: 16th May 2010 after some feedback Take these two classes for example: public class User { public string Id { [...]]]></description>
			<content:encoded><![CDATA[<p>In my last <a href="http://schotime.net/blog/index.php/2010/04/29/nosql-norm-mongodb-and-regular-expressions/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/schotime.net/blog/index.php/2010/04/29/nosql-norm-mongodb-and-regular-expressions/?referer=');">post</a> I told you about how you can use Regular Expressions to do complex queries in mongodb. In this post I will show you some more features of the Linq Provider.</p>
<p><strong>Updated: 16th May 2010 after some feedback</strong></p>
<p>Take these two classes for example:</p>
<table style="background: black" cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400"> 
<pre class="code"><span style="background: black; color: white">    </span><span style="background: black; color: #cc7832">public class </span><span style="background: black; color: #ffc66d">User
    </span><span style="background: black; color: white">{
        </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">Id { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
        </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">Name { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
        </span><span style="background: black; color: #cc7832">public </span><span style="background: black; color: #6897bb">IList</span><span style="background: black; color: white">&lt;</span><span style="background: black; color: #ffc66d">Role</span><span style="background: black; color: white">&gt; Roles { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
    }

    </span><span style="background: black; color: #cc7832">public class </span><span style="background: black; color: #ffc66d">Role
    </span><span style="background: black; color: white">{
        </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">Name { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
        </span><span style="background: black; color: #cc7832">public int </span><span style="background: black; color: white">AccessLevel { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
    }</span></pre>
</td>
</tr>
</tbody>
</table>
<p>and given the following data:</p>
<table style="background: black" cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
        </p>
<pre class="code"><span style="background: black; color: white">            </span><span style="background: black; color: #cc7832">var </span><span style="background: black; color: white">standardRole = </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">Role </span><span style="background: black; color: white">{Name = </span><span style="background: black; color: #a5c25c">&quot;Standard&quot;</span><span style="background: black; color: white">, AccessLevel = </span><span style="background: black; color: #6897bb">2</span><span style="background: black; color: white">};
            </span><span style="background: black; color: #cc7832">var </span><span style="background: black; color: white">adminRole = </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">Role </span><span style="background: black; color: white">{ Name = </span><span style="background: black; color: #a5c25c">&quot;Standard&quot;</span><span style="background: black; color: white">, AccessLevel = </span><span style="background: black; color: #6897bb">5 </span><span style="background: black; color: white">};
            </span><span style="background: black; color: #cc7832">var </span><span style="background: black; color: white">user1 = </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">User</span><span style="background: black; color: white">()
            {
                Id = </span><span style="background: black; color: #a5c25c">&quot;jbloggs&quot;</span><span style="background: black; color: white">,
                Name = </span><span style="background: black; color: #a5c25c">&quot;Joe Bloggs&quot;</span><span style="background: black; color: white">,
                Roles = </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">List</span><span style="background: black; color: white">&lt;</span><span style="background: black; color: #ffc66d">Role</span><span style="background: black; color: white">&gt;
                            {
                                standardRole,
                                adminRole
                            }
            };

            </span><span style="background: black; color: #cc7832">var </span><span style="background: black; color: white">user2 = </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">User</span><span style="background: black; color: white">()
            {
                Id = </span><span style="background: black; color: #a5c25c">&quot;tsmith&quot;</span><span style="background: black; color: white">,
                Name = </span><span style="background: black; color: #a5c25c">&quot;Tony Smith&quot;</span><span style="background: black; color: white">,
                Roles = </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">List</span><span style="background: black; color: white">&lt;</span><span style="background: black; color: #ffc66d">Role</span><span style="background: black; color: white">&gt;
                            {
                                standardRole,
                            }
            };</span></pre>
</td>
</tr>
</tbody>
</table>
<p>Now say I want to find all users with access level greater than or equal to 5. In Linq-2-sql or plain sql your might write this query like the following. </p>
<table style="background: black" cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
          </p>
<pre class="code"><span style="background: black; color: #cc7832">var </span><span style="background: black; color: white">query = list.Where(x =&gt; x.Roles.Where(y =&gt; y.AccessLevel &gt;= </span><span style="background: black; color: #6897bb">5</span><span style="background: black; color: white">).Count() &gt; </span><span style="background: black; color: #6897bb">0</span><span style="background: black; color: white">).ToList();</span></pre>
</td>
</tr>
</tbody>
</table>
<p>This query will not work in the NoRM linq provider, however there is an alternative.</p>
<table style="background: black" cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
        </p>
<pre><span style="background: black; color: #cc7832">1. var </span><span style="background: black; color: white">queryforMongo = list.Where(x =&gt; x.Roles[0].AccessLevel &gt;= </span><span style="background: black; color: #6897bb">5</span><span style="background: black; color: white">).ToList();or</span></pre>
<pre class="code"><span style="background: black; color: #cc7832">2. var </span><span style="background: black; color: white">queryforMongo = list.Where(x =&gt; x.Roles.Any(y=&gt;y.AccessLevel &gt;= </span><span style="background: black; color: #6897bb">5)</span><span style="background: black; color: white">).ToList();</span></pre>
<pre><span style="background: black; color: white"></span><span style="background: black; color: white"></span></pre>
</td>
</tr>
</tbody>
</table>
<p>Query 1 here will only return Users where the first role has an access level greater than or equal to 5.<br />
  <br />Query 2 will return Users where 1 of the Roles has an access level greater than or equal to 5.</p>
<p><strong>One caveat though.</strong> If you try and do a complex query ( one involving an “or” condition or a “and” using the same property ) then you will get an exception. This is because complex queries get converted to a javascript function that cannot be used in the same ways. </p>
<p>Hope this comes in handy for folks out there. </p>
<p>Adam</p>
]]></content:encoded>
			<wfw:commentRss>http://schotime.net/blog/index.php/2010/05/14/norm-mongodb-and-complex-queries/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>NOSQL, NoRM (mongoDB) and Regular Expressions</title>
		<link>http://schotime.net/blog/index.php/2010/04/29/nosql-norm-mongodb-and-regular-expressions/</link>
		<comments>http://schotime.net/blog/index.php/2010/04/29/nosql-norm-mongodb-and-regular-expressions/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 07:57:29 +0000</pubDate>
		<dc:creator>Schotime</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Linq]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[NoRM]]></category>
		<category><![CDATA[Regex]]></category>

		<guid isPermaLink="false">http://schotime.net/blog/index.php/2010/04/29/nosql-norm-mongodb-and-regular-expressions/</guid>
		<description><![CDATA[Over the past few weeks I have got quite involved in the development of the Open Source NoRM project started by Andrew Theken which is a MongoDB driver for C#. In particular I have been refactoring and adding new functionality to the LINQ provider. It currently supports a lot of functionality including deep queries, regex, [...]]]></description>
			<content:encoded><![CDATA[<p>Over the past few weeks I have got quite involved in the development of the Open Source <a href="http://github.com/atheken/NoRM" onclick="pageTracker._trackPageview('/outgoing/github.com/atheken/NoRM?referer=');">NoRM</a> project started by <a href="http://andrewtheken.com/" onclick="pageTracker._trackPageview('/outgoing/andrewtheken.com/?referer=');">Andrew Theken</a> which is a <a href="http://www.mongodb.org/" onclick="pageTracker._trackPageview('/outgoing/www.mongodb.org/?referer=');">MongoDB</a> driver for C#. In particular I have been refactoring and adding new functionality to the LINQ provider.</p>
<p>It currently supports a lot of functionality including deep queries, regex, datetime which is really exciting. In this post though I am going to concentrate on regular expressions.</p>
<p>This is the newest part of the Linq provider however it is probably the most powerful, especially for complex queries. The reason for this is that MongoDB will use the indexes created when a regular expression is used (where the query is not a complex query). A complex query is one that filters on the same property twice, uses a string function (replace/substring/toLower etc) or does some other fancy stuff. For example using the toUpper() method.</p>
<table style="background: black;" border="1" cellspacing="0" cellpadding="2" width="400">
<tbody>
<tr>
<td width="400" valign="top">
<pre class="code"><span style="background: black; color: #cc7832;">var </span><span style="background: black; color: white;">products = session.Products.Where(x =&gt; x.Name.ToUpper() == </span><span style="background: black; color: #a5c25c;">"TEST3"</span><span style="background: black; color: white;">).ToList();</span></pre>
</td>
</tr>
</tbody>
</table>
<p>Anyways….i digress. So, here is an example of using a Regex in a Linq Query. Pretty simple.</p>
<table style="background: black;" border="1" cellspacing="0" cellpadding="2" width="400">
<tbody>
<tr>
<td width="400" valign="top">
<pre class="code"><span style="background: black; color: #cc7832;">var </span><span style="background: black; color: white;">products = session.Products.Where(p =&gt; </span><span style="background: black; color: #ffc66d;">Regex</span><span style="background: black; color: white;">.IsMatch(p.Name, </span><span style="background: black; color: #a5c25c;">"^te"</span><span style="background: black; color: white;">)).ToList();</span></pre>
</td>
</tr>
</tbody>
</table>
<p>Using the static Regex.IsMatch is the only way to invoke a regex call using the Linq Provider. This will however run blazingly fast. I tested this query on 1,000,000 Products and it only took 1.5sec, which was approximately 10x faster than when a complex query is invoked. There are however 3 string functions that have been optimized using this regex functionality. They are StartsWith(), EndsWith() and Contains() which is why the following query only takes 2secs to return over 48,000 rows, however when using Skip() and Take() you can get 50 results back in just milliseconds.</p>
<table style="background: black;" border="1" cellspacing="0" cellpadding="2" width="400">
<tbody>
<tr>
<td width="400" valign="top">
<pre class="code"><span style="background: black; color: #cc7832;">var </span><span style="background: black; color: white;">products = session.Products.Where(x =&gt; x.Name.StartsWith(</span><span style="background: black; color: #a5c25c;">"X"</span><span style="background: black; color: white;">)).ToList();</span></pre>
</td>
</tr>
</tbody>
</table>
<p>The Linq provider also supports 3 of the RegexOptions. They are RegexOptions.IgnoreCase (but please note this will not use the index so will be slower), RegexOptions.Multiline and RegexOptions.None. Regex’s can also be used in conjunction with other filters. eg.</p>
<table style="background: black;" border="1" cellspacing="0" cellpadding="2" width="400">
<tbody>
<tr>
<td width="400" valign="top"><span style="background: black; color: #cc7832;"></p>
<pre class="code">var <span style="background: black; color: white;">products = session.Products.Where(p =&gt; </span><span style="background: black; color: #ffc66d;">Regex</span><span style="background: black; color: white;">.IsMatch(p.Name, </span><span style="background: black; color: #a5c25c;">"^te"</span><span style="background: black; color: white;">) &amp;&amp; p.Price == </span><span style="background: black; color: #6897bb;">10</span><span style="background: black; color: white;">).ToList();</span></pre>
<p></span></td>
</tr>
</tbody>
</table>
<p>This query is not considered a complex query because two different properties are used and an “and”(&amp;&amp;) operator is used.</p>
<p><strong><em>Please note:</em></strong> Any time a “or” (||) operator is used, it will be considered a complex query.</p>
<p><strong>Summary:</strong></p>
<p><strong> </strong></p>
<p>If you have a filter than can be written as a regex, chances are it will be as fast or faster than without using a regex.</p>
<p>So please go and try out NoRM and enjoy the freedom. I will try and post some more cool stuff in the LINQ provider over the next few weeks. Stay tuned.</p>
]]></content:encoded>
			<wfw:commentRss>http://schotime.net/blog/index.php/2010/04/29/nosql-norm-mongodb-and-regular-expressions/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>FluentValidation Xval Integration</title>
		<link>http://schotime.net/blog/index.php/2009/06/13/fluentvalidation-xval-integration/</link>
		<comments>http://schotime.net/blog/index.php/2009/06/13/fluentvalidation-xval-integration/#comments</comments>
		<pubDate>Fri, 12 Jun 2009 14:00:00 +0000</pubDate>
		<dc:creator>Schotime</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Fluent Validation]]></category>
		<category><![CDATA[Validation]]></category>
		<category><![CDATA[xVal]]></category>

		<guid isPermaLink="false">http://schotime.net/blog/index.php/2009/06/13/fluentvalidation-xval-integration/</guid>
		<description><![CDATA[After a few months of using FluentValidation I asked its author Jeremy Skinner if it were possible to integrate this with xVal. At that time it was not possible because there were no easy way to access the properties needed by xVal. After submitting a few patches, we now have a solution which enables xVal [...]]]></description>
			<content:encoded><![CDATA[<p>After a few months of using <a href="http://fluentvalidation.codeplex.com" target="_blank" onclick="pageTracker._trackPageview('/outgoing/fluentvalidation.codeplex.com?referer=');">FluentValidation</a> I asked its author Jeremy Skinner if it were possible to integrate this with <a href="http://xval.codeplex.com" target="_blank" onclick="pageTracker._trackPageview('/outgoing/xval.codeplex.com?referer=');">xVal</a>. At that time it was not possible because there were no easy way to access the properties needed by xVal. After submitting a few patches, we now have a solution which enables xVal integration with most of the FV validators.</p>
<p>It currently supports the following FV validatiors:</p>
<ul>
<li>NullValidator </li>
<li>NotEmptyValidator </li>
<li>LengthValidator </li>
<li>RegularExpressionValidator </li>
<li>ComparisonValidator including:
<ul>
<li>Equal </li>
<li>Not Equal </li>
<li>Greater Than or Equal </li>
<li>Less Than or Equal </li>
</ul>
</li>
</ul>
<p>To configure the integration we need to tell xVal to use the FV rules provider rather than the default one. This is done in the global.asax.cs in Application_Start().</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td style="background: black" valign="top" width="400">
<pre class="code"><span style="background: black; color: white">xVal.</span><span style="background: black; color: #ffc66d">ActiveRuleProviders</span><span style="background: black; color: white">.Providers.Clear();
xVal.</span><span style="background: black; color: #ffc66d">ActiveRuleProviders</span><span style="background: black; color: white">.Providers.Add(
    </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: white">FluentValidation.xValIntegration.
            </span><span style="background: black; color: #ffc66d">FluentValidationRulesProvider</span><span style="background: black; color: white">(</span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">AttributedValidatorFactory</span><span style="background: black; color: white">()));</span></pre>
</td>
</tr>
</tbody>
</table>
<p>The rules provider here is instructed to use the AttributedValidatorFactory to instruct the provider to use the attribute attached to the model class to find the validation class for that model.</p>
<p>Note: This is still new and xVal is still in beta so there may be some issues. If you find any please let me know so we can fix them as soon as possible.</p>
<p>Hopefully once its ready it can be checked in with the other providers at the xVal codeplex site.</p>
<p>This is currently in the development source code which can be downloaded and tried now.</p>
<p>Cheers,</p>
<p>Adam</p>
]]></content:encoded>
			<wfw:commentRss>http://schotime.net/blog/index.php/2009/06/13/fluentvalidation-xval-integration/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Fluent Validation Model Binder &#8211; Asp.net MVC</title>
		<link>http://schotime.net/blog/index.php/2009/05/11/fluent-validation-model-binder-aspnet-mvc/</link>
		<comments>http://schotime.net/blog/index.php/2009/05/11/fluent-validation-model-binder-aspnet-mvc/#comments</comments>
		<pubDate>Mon, 11 May 2009 13:59:00 +0000</pubDate>
		<dc:creator>Schotime</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Fluent Validation]]></category>
		<category><![CDATA[Validation]]></category>

		<guid isPermaLink="false">http://schotime.net/blog/index.php/2009/05/11/fluent-validation-model-binder-aspnet-mvc/</guid>
		<description><![CDATA[A few weeks ago I found the Fluent Validation framework by Jeremy Skinner. I needed to conditionally validate a model depending on an application setting. eg. Description field mandatory / not mandatory depending on the clients business requirements. I loved the simplicity of the framework and the separation from the model it provided. Since then [...]]]></description>
			<content:encoded><![CDATA[<p>A few weeks ago I found the <a href="http://fluentvalidation.codeplex.com/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/fluentvalidation.codeplex.com/?referer=');">Fluent Validation</a> framework by <a href="http://www.jeremyskinner.co.uk/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.jeremyskinner.co.uk/?referer=');">Jeremy Skinner</a>. I needed to conditionally validate a model depending on an application setting. eg. Description field mandatory / not mandatory depending on the clients business requirements. I loved the simplicity of the framework and the separation from the model it provided.</p>
<p>Since then I have submitted a few patches for the framework, one of which is the Fluent Validation Model binder. Inspired by the Data Annotations Model binder, it works in much the same way. Once you have it set to your default model binder, it will validate any model which contains the specific attribute. This will become clear in the examples below.</p>
<p>Firstly lets take our model.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td style="background: black" valign="top" width="400" code?="code?"><span style="background: black; color: white">           <br /> 
<pre class="code"><span style="background: black; color: white">    [</span><span style="background: black; color: #ffc66d">Validator</span><span style="background: black; color: white">(</span><span style="background: black; color: #cc7832">typeof</span><span style="background: black; color: white">(</span><span style="background: black; color: #ffc66d">LineItemValidator</span><span style="background: black; color: white">))]
    </span><span style="background: black; color: #cc7832">public class </span><span style="background: black; color: #ffc66d">LineItem
    </span><span style="background: black; color: white">{
        </span><span style="background: black; color: #cc7832">public int </span><span style="background: black; color: white">LineNumber { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
        </span><span style="background: black; color: #cc7832">public </span><span style="background: black; color: #6897bb">DateTime </span><span style="background: black; color: white">Date { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
        </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">Description { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
        </span><span style="background: black; color: #cc7832">public decimal </span><span style="background: black; color: white">Net { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
        </span><span style="background: black; color: #cc7832">public decimal </span><span style="background: black; color: white">Tax { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
        </span><span style="background: black; color: #cc7832">public decimal </span><span style="background: black; color: white">Gross { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
    }</span></pre>
<p>          <a href="http://11011.net/software/vspaste" onclick="pageTracker._trackPageview('/outgoing/11011.net/software/vspaste?referer=');"></a></p>
<p></span></td>
</tr>
</tbody>
</table>
<p>Attached to this simple LineItem class is a Validator attribute. This attribute is used by the Model Binder to locate the Class used for validation. Below I will define my LineItemValidator class which will hold the rules for the validation.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td style="background: black" valign="top" width="400" code?="code?">
<pre><span style="background: black; color: white">    </span><span style="background: black; color: #cc7832">public class </span><span style="background: black; color: #ffc66d">LineItemValidator </span><span style="background: black; color: white">: </span><span style="background: black; color: #ffc66d">AbstractValidator</span><span style="background: black; color: white">&lt;</span><span style="background: black; color: #ffc66d">LineItem</span><span style="background: black; color: white">&gt;
    {
        </span><span style="background: black; color: #cc7832">public </span><span style="background: black; color: white">LineItemValidator()
        {
            RuleFor(x =&gt; x.Description)
                .NotEmpty().When(x =&gt; </span><span style="background: black; color: #ffc66d">Settings</span><span style="background: black; color: white">.DescriptionRequired)
                .And
                .Length(</span><span style="background: black; color: #6897bb">0</span><span style="background: black; color: white">, </span><span style="background: black; color: #6897bb">30</span><span style="background: black; color: white">);

            RuleFor(x =&gt; x.Date)
                .GreaterThanOrEqualTo(</span><span style="background: black; color: #6897bb">DateTime</span><span style="background: black; color: white">.Today);

            RuleFor(x =&gt; x.Net)
                .GreaterThan(</span><span style="background: black; color: #6897bb">0</span><span style="background: black; color: white">);

            RuleFor(x =&gt; x.Gross)
                .GreaterThan(</span><span style="background: black; color: #6897bb">0</span><span style="background: black; color: white">)
                .And
                .Equal(y =&gt; (y.Net + y.Tax))
                .WithName(</span><span style="background: black; color: #a5c25c">&quot;Total Amount&quot;</span><span style="background: black; color: white">);
        }
    }</span></pre>
<p>        <a href="http://11011.net/software/vspaste" onclick="pageTracker._trackPageview('/outgoing/11011.net/software/vspaste?referer=');"></a></td>
</tr>
</tbody>
</table>
<p>As you can see the class must inherit from AbstractValidator&lt;T&gt; where T is the model you want to define the rules for. The first rule uses the conditional When clause where it will only validate that the field is NotEmpty when the Settings.DescriptionRequired boolean is true. Also, another thing is the complex validation taking place on the Gross field. Not only does it validate that it is greater than 0, but that the value is equal to the net + tax amount. This is very elegant indeed. I have also specified the ‘WithName’ clause which has also been integrated into the model binder so that if an error occurs with the gross field, the WithName value will be displayed when an error happens. This is extremely handy for language localization or when the name of the field on the Model is insufficient. </p>
<p>Wiring this Model binder up in the Application_start event in the global.asax.cs is as easy as this.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td style="background: black" valign="top" width="400" code?="code?">
<pre><span style="background: black; color: white">     </span><span style="background: black; color: #ffc66d">ModelBinders</span><span style="background: black; color: white">.Binders.DefaultBinder =
                </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">FluentValidationModelBinder</span><span style="background: black; color: white">(</span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">AttributedValidatorFactory</span><span style="background: black; color: white">());</span></pre>
</td>
</tr>
</tbody>
</table>
<p>Note that we have to pass an instance of the AttributedValidatoryFactory into the Model Binder. This means if you have an alternate way of locating the Validator class other than via the attribute you can inherit from IValidatorFactory and create your own.</p>
<p>Now when a parameter of LineItem gets passed into a controller it will be validated against the model and all errors placed into the ModelState. This can then check the isValid property to determine if there are any errors and proceed accordingly.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td style="background: black" valign="top" width="400"><span style="background: black; color: white"><br />
          </p>
<pre class="code"><span style="background: black; color: white">        [</span><span style="background: black; color: #ffc66d">AcceptVerbs</span><span style="background: black; color: white">(</span><span style="background: black; color: #6897bb">HttpVerbs</span><span style="background: black; color: white">.Post)]
        </span><span style="background: black; color: #cc7832">public </span><span style="background: black; color: #ffc66d">ActionResult </span><span style="background: black; color: white">Edit(</span><span style="background: black; color: #ffc66d">List</span><span style="background: black; color: white">&lt;</span><span style="background: black; color: #ffc66d">LineItem</span><span style="background: black; color: white">&gt; lineItems)
        {
            </span><span style="background: black; color: #cc7832">if </span><span style="background: black; color: white">(ModelState.IsValid)
                </span><span style="background: black; color: #cc7832">return </span><span style="background: black; color: white">RedirectToAction(</span><span style="background: black; color: #a5c25c">&quot;Edit&quot;</span><span style="background: black; color: white">);

            </span><span style="background: black; color: #cc7832">return </span><span style="background: black; color: white">View();
        }</span></pre>
<p>        </span></td>
</tr>
</tbody>
</table>
<p>And that’s it. I hope you enjoy using the Fluent Validation framework as much as I have and happy coding. For all you guys waiting for xVal integration, I will try and post a solution in the coming week. </p>
</p>
<p>Adam
  </p>
]]></content:encoded>
			<wfw:commentRss>http://schotime.net/blog/index.php/2009/05/11/fluent-validation-model-binder-aspnet-mvc/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Integrating xVal Validation with Linq-to-Sql</title>
		<link>http://schotime.net/blog/index.php/2009/03/31/integrating-xval-validation-with-linq-to-sql/</link>
		<comments>http://schotime.net/blog/index.php/2009/03/31/integrating-xval-validation-with-linq-to-sql/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 13:58:00 +0000</pubDate>
		<dc:creator>Schotime</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Validation]]></category>
		<category><![CDATA[xVal]]></category>

		<guid isPermaLink="false">http://schotime.net/blog/index.php/2009/03/31/integrating-xval-validation-with-linq-to-sql/</guid>
		<description><![CDATA[In a previous post I showed you how you can use xVal and the IDataErrorInfo class to add validation to your Asp.net MVC website. In this post I will extend that to Linq-to-Sql and the classes it generates. The northwind database has a suppliers table. The info contained below is using that table with linq-to-sql. [...]]]></description>
			<content:encoded><![CDATA[<p>In a previous <a href="http://schotime.net/blog/index.php/2009/03/05/validation-with-aspnet-mvc-xval-idataerrorinfo/" onclick="pageTracker._trackPageview('/outgoing/schotime.net/blog/index.php/2009/03/05/validation-with-aspnet-mvc-xval-idataerrorinfo/?referer=');">post</a> I showed you how you can use xVal and the IDataErrorInfo class to add validation to your Asp.net MVC website. In this post I will extend that to Linq-to-Sql and the classes it generates.</p>
<p>The northwind database has a suppliers table. The info contained below is using that table with linq-to-sql. </p>
<p>After adding the table to the designer, a Supplier class gets constructed in the background. This class is a partial class which means we can add to it without changing the code auto-generated in the designer.cs file.</p>
<p>We can then create a partial class called Supplier inheriting from Custom Validation and add a MetadataType attribute to it. This attribute specifies the class for which use for validating the Supplier class.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td style="background: black" valign="top" width="400">
<pre class="code"><span style="background: black; color: white">    [</span><span style="background: black; color: #ffc66d">MetadataType</span><span style="background: black; color: white">(</span><span style="background: black; color: #cc7832">typeof</span><span style="background: black; color: white">(</span><span style="background: black; color: #ffc66d">SupplierValidation</span><span style="background: black; color: white">))]
</span><span style="background: black; color: #cc7832">    public partial class </span><span style="background: black; color: #ffc66d">Supplier</span><span style="background: black; color: white"> : </span><span style="background: black; color: #ffc66d">CustomValidation</span><span style="background: black; color: #ffc66d">
</span><span style="background: black; color: white">    {
    }</span></pre>
</td>
</tr>
</tbody>
</table>
<p>We can then create the SupplierValidation class specifying the properties of the Supplier class we would like to be validated. For instance here I only want to validate the ContactName and the ContactTitle of the Supplier.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td style="background: black" valign="top" width="400">
<pre class="code"><span style="background: black; color: white">    </span><span style="background: black; color: #cc7832">    public class </span><span style="background: black; color: #ffc66d">SupplierValidation
    </span><span style="background: black; color: white">{
        [</span><span style="background: black; color: #ffc66d">Required</span><span style="background: black; color: white">]
        </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">ContactName { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }

        [</span><span style="background: black; color: #ffc66d">Required</span><span style="background: black; color: white">, </span><span style="background: black; color: #ffc66d">Range</span><span style="background: black; color: white">(</span><span style="background: black; color: #6897bb">0</span><span style="background: black; color: white">, </span><span style="background: black; color: #6897bb">10</span><span style="background: black; color: white">)]
        </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">ContactTitle { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
    }</span></pre>
</td>
</tr>
</tbody>
</table>
<p>This specifies that both fields are required and that the ContactTitle cannot be more than 10 characters in length. </p>
<p>The other benefit of using the buddy class here is that if you need to regenerate a table in the linq-to-sql designer, you won’t lose your changes because they’re contained in a separate file.</p>
<p>From here when a Supplier gets passed to in as a parameter on a Controller action it will be validated using the rules in the Supplier Validation class. </p>
<p>Cheers,<br />
  <br />Adam</p>
]]></content:encoded>
			<wfw:commentRss>http://schotime.net/blog/index.php/2009/03/31/integrating-xval-validation-with-linq-to-sql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Transforming one-to-many Sql into Nested Class</title>
		<link>http://schotime.net/blog/index.php/2009/01/22/transforming-one-to-many-sql-into-nested-class/</link>
		<comments>http://schotime.net/blog/index.php/2009/01/22/transforming-one-to-many-sql-into-nested-class/#comments</comments>
		<pubDate>Thu, 22 Jan 2009 11:13:13 +0000</pubDate>
		<dc:creator>Schotime</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Linq]]></category>

		<guid isPermaLink="false">http://schotime.net/blog/index.php/2009/01/22/transforming-one-to-many-sql-into-nested-class/</guid>
		<description><![CDATA[Back in the days of Classic ASP, when you had a one too many relationship displaying the data was pretty painful. You would do things like var reference_number_old = &#34;$##%@&#34;; while (recordsExist) { reference_number = String(rs(0)); if (reference_number_old != reference_number) { Response.Write(reference_number); reference_number_old = reference_number; } //Do more stuff } Sooo very very painful, and [...]]]></description>
			<content:encoded><![CDATA[<p>Back in the days of Classic ASP, when you had a one too many relationship displaying the data was pretty painful. You would do things like </p>
<table style="background: black" cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
<pre class="code"><span style="background: black; color: white">        var reference_number_old = </span><span style="background: black; color: #a5c25c">&quot;$##%@&quot;</span><span style="background: black; color: white">;
        </span><span style="background: black; color: #cc7832">while </span><span style="background: black; color: white">(recordsExist)
        {
            reference_number = String(rs(</span><span style="background: black; color: #6897bb">0</span><span style="background: black; color: white">));

            </span><span style="background: black; color: #cc7832">if </span><span style="background: black; color: white">(reference_number_old != reference_number)
            {
                Response.Write(reference_number);
                reference_number_old = reference_number;
            }

            </span><span style="background: black; color: gray">//Do more stuff
        </span><span style="background: black; color: white">}</span></pre>
</td>
</tr>
</tbody>
</table>
<p>Sooo very very painful, and that&#8217;s only grouping by one column (reference number).</p>
<p>Now however with OO programming and the advance of Linq there is a much nicer and easier way to deal with this Master-Detail type one-to-many relationship.</p>
<p>Lets see how we do it now, still using our own custom sql.<br />
  <br />Firstly here is our class to represent our flat data straight out of the database.</p>
<table style="background: black" cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
        </p>
<pre class="code"><span style="background: black; color: white">        </span><span style="background: black; color: #cc7832">public class </span><span style="background: black; color: #ffc66d">FlatCustomerAndOrders
        </span><span style="background: black; color: white">{
            </span><span style="background: black; color: #cc7832">public int </span><span style="background: black; color: white">ReferenceNumber { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
            </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">Name { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
            </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">Address { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
            </span><span style="background: black; color: #cc7832">public int </span><span style="background: black; color: white">OrderId { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
            </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">ProductName { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
            </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">Description { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
            </span><span style="background: black; color: #cc7832">public decimal </span><span style="background: black; color: white">Amount { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
        }</span></pre>
</td>
</tr>
</tbody>
</table>
<p>Even filling this class used to be a bit painful before Linq. You would have to create a connection, create a reader, then instantiate the FlatCustomerAndOrders class. Set the properties then add the object to a list while records could still be read. Here&#8217;s how I do it now.</p>
<table style="background: black" cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
<pre class="code"><span style="background: black; color: white">        </span><span style="background: black; color: #ffc66d">DataContext </span><span style="background: black; color: white">dc = </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">DataContext</span><span style="background: black; color: white">(</span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">SqlConnection</span><span style="background: black; color: white">(connString));
        </span><span style="background: black; color: #6897bb">IEnumerable</span><span style="background: black; color: white">&lt;</span><span style="background: black; color: #ffc66d">FlatCustomerAndOrders</span><span style="background: black; color: white">&gt; flat =
            dc.ExecuteQuery&lt;</span><span style="background: black; color: #ffc66d">FlatCustomerAndOrders</span><span style="background: black; color: white">&gt;(</span><span style="background: black; color: #a5c25c">&quot;select c.referencenumber, c.name,&quot; </span><span style="background: black; color: white">+
            </span><span style="background: black; color: #a5c25c">&quot;c.address, o.orderid, o.productname, o.description, o.amount from customers &quot; </span><span style="background: black; color: white">+
            </span><span style="background: black; color: #a5c25c">&quot;c inner join orders o on c.referencenumber = o.referencenumber&quot;</span><span style="background: black; color: white">);
</span></pre>
<p>        <a href="http://11011.net/software/vspaste" onclick="pageTracker._trackPageview('/outgoing/11011.net/software/vspaste?referer=');"></a></td>
</tr>
</tbody>
</table>
<p>Thats its. We have our List of FlatCustomerAndOrders.<br />
  <br />The next step is to organise the data so that the data is nested so its easy to display with just two foreach loops. The two classes:</p>
<table style="background: black" cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
        </p>
<pre class="code"><span style="background: black; color: white">        </span><span style="background: black; color: #cc7832">public class </span><span style="background: black; color: #ffc66d">Customer
        </span><span style="background: black; color: white">{
            </span><span style="background: black; color: #cc7832">public int </span><span style="background: black; color: white">ReferenceNumber { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
            </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">Name { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
            </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">Address { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
            </span><span style="background: black; color: #cc7832">public </span><span style="background: black; color: #ffc66d">List</span><span style="background: black; color: white">&lt;</span><span style="background: black; color: #ffc66d">Order</span><span style="background: black; color: white">&gt; Orders { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
        }

        </span><span style="background: black; color: #cc7832">public class </span><span style="background: black; color: #ffc66d">Order
        </span><span style="background: black; color: white">{
            </span><span style="background: black; color: #cc7832">public int </span><span style="background: black; color: white">OrderId { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
            </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">ProductName { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
            </span><span style="background: black; color: #cc7832">public string </span><span style="background: black; color: white">Description { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
            </span><span style="background: black; color: #cc7832">public decimal </span><span style="background: black; color: white">Amount { </span><span style="background: black; color: #cc7832">get</span><span style="background: black; color: white">; </span><span style="background: black; color: #cc7832">set</span><span style="background: black; color: white">; }
        }</span></pre>
</td>
</tr>
</tbody>
</table>
<p>To fill these two class we do some clever Linq using the GroupBy method. Here&#8217;s the code.</p>
<table style="background: black" cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
<pre class="code"><span style="background: black; color: white">        </span><span style="background: black; color: #6897bb">IList</span><span style="background: black; color: white">&lt;</span><span style="background: black; color: #ffc66d">Customer</span><span style="background: black; color: white">&gt; Customers =
            flat.GroupBy(cust =&gt; </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: white">{ cust.ReferenceNumber, cust.Name, cust.Address })
                .Select(c =&gt; </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">Customer</span><span style="background: black; color: white">()
                {
                    ReferenceNumber = c.Key.ReferenceNumber,
                    Name = c.Key.Name,
                    Address = c.Key.Address,
                    Orders = c.Select(o =&gt; </span><span style="background: black; color: #cc7832">new </span><span style="background: black; color: #ffc66d">Order</span><span style="background: black; color: white">()
                    {
                        OrderId = o.OrderId,
                        ProductName = o.ProductName,
                        Description = o.Description,
                        Amount = o.Amount
                    }).ToList()
                }).ToList();</span></pre>
</td>
</tr>
</tbody>
</table>
<p>And that&#8217;s it. It may look like a bit of a mouthful but its quite simple really.<br />
  <br />It just takes the flat list and applies the groupby method to it grouping by the three customer columns. It then builds a new list to fill the Orders property with. </p>
<p>Its then super easy to display the data like so.</p>
<table style="background: black" cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
<pre class="code"><span style="background: black; color: white">       </span><span style="background: black; color: #cc7832"> foreach </span><span style="background: black; color: white">(</span><span style="background: black; color: #ffc66d">Customer </span><span style="background: black; color: white">c </span><span style="background: black; color: #cc7832">in </span><span style="background: black; color: white">Customers)
        {
            </span><span style="background: black; color: gray">//Display the customer details

            </span><span style="background: black; color: #cc7832">foreach </span><span style="background: black; color: white">(</span><span style="background: black; color: #ffc66d">Order </span><span style="background: black; color: white">o </span><span style="background: black; color: #cc7832">in </span><span style="background: black; color: white">c.Orders)
            {
                </span><span style="background: black; color: gray">//Display the orders for each customer
            </span><span style="background: black; color: white">}
        }
</span></pre>
<p>        <a href="http://11011.net/software/vspaste" onclick="pageTracker._trackPageview('/outgoing/11011.net/software/vspaste?referer=');"></a></td>
</tr>
</tbody>
</table>
<p>Well I hope this helps you as much as it has helped me.</p>
<p>Cheers<br />
  <br />Schotime </p>
]]></content:encoded>
			<wfw:commentRss>http://schotime.net/blog/index.php/2009/01/22/transforming-one-to-many-sql-into-nested-class/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Slow TcpClient Connection (sockets)</title>
		<link>http://schotime.net/blog/index.php/2008/05/27/slow-tcpclient-connection-sockets/</link>
		<comments>http://schotime.net/blog/index.php/2008/05/27/slow-tcpclient-connection-sockets/#comments</comments>
		<pubDate>Tue, 27 May 2008 03:25:48 +0000</pubDate>
		<dc:creator>Schotime</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Sockets]]></category>

		<guid isPermaLink="false">http://schotime.net/index.php/2008/05/27/slow-tcpclient-connection-sockets/</guid>
		<description><![CDATA[Recently I have been experimenting with Sockets and trying to communicate with a windows service both with a console app and a website. After managing to get some lines of communication going between the client and server applications, I couldn&#8217;t help but notice that it was taking a little bit longer than it probably should [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I have been experimenting with Sockets and trying to communicate with a windows service both with a console app and a website.</p>
<p>After managing to get some lines of communication going between the client and server applications, I couldn&#8217;t help but notice that it was taking a little bit longer than it probably should have. I decided to have a closer look. </p>
<p>Using some basic timestamping in the console/website application the whole process was taking just over 1 second. This was to connect, send and then receive a response. Further investigation revealed only 1 statement was causing the time to blow out. Below is the statement.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
<pre class="code"><span style="color: #2b91af">TcpClient </span>socketForServer = <span style="color: blue">new </span><span style="color: #2b91af">TcpClient</span>(<span style="color: #a31515">"localhost"</span>, 200);</pre>
</td>
</tr>
</tbody>
</table>
<p>Now in all the demos and tutorials this is how it showed to connect to the server. Pretty straightforward and simple. Or so I thought. Whilst having a look through the methods associated with the TcpClient, there was one that stood out: Connect(). Hmmm&#8230;this also took a host name and a port. I decided to give it a try.</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
<pre class="code"><span style="color: #2b91af">TcpClient </span>socketForServer = <span style="color: blue">new </span><span style="color: #2b91af">TcpClient</span>();
socketForServer.Connect(<span style="color: #a31515">"localhost"</span>, 200);</pre>
</td>
</tr>
</tbody>
</table>
<p>I bet you&#8217;re wondering right now. What is the difference?? At this point in time I&#8217;m not quite sure but I&#8217;m determined to figure it out because after making that change the time to execute the previous two statements was about 1 millisecond or so. Much better.</p>
<p>One thing that did seem odd was if the TcpClient failed to make a connection, the response time was almost exactly the same (~1sec). </p>
<p>If anyone knows the reason, please leave a comment. Until then, two lines will have to do.</p>
]]></content:encoded>
			<wfw:commentRss>http://schotime.net/blog/index.php/2008/05/27/slow-tcpclient-connection-sockets/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

