<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Mehfuz's WebLog</title><link>http://weblogs.asp.net/mehfuzh/default.aspx</link><description>Exploring, to seek out new possibilities and technologies.</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><creativeCommons:license>http://creativecommons.org/licenses/by/2.0/</creativeCommons:license><image><link>http://creativecommons.org/licenses/by/2.0/</link><url>http://creativecommons.org/images/public/somerights20.gif</url><title>Some Rights Reserved</title></image><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/burncsharp" type="application/rss+xml" /><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fburncsharp" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fburncsharp" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Fburncsharp" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.rojo.com/add-subscription?resource=http%3A%2F%2Ffeeds.feedburner.com%2Fburncsharp" src="http://blog.rojo.com/RojoWideRed.gif">Subscribe with Rojo</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/burncsharp" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fburncsharp" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fburncsharp" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.yourminis.com/subscribe.aspx?u=http%3A%2F%2Ffeeds.feedburner.com%2Fburncsharp" src="http://www.yourminis.com/images/addtoyourminisbadge.gif">Subscribe with Yourminis.com</feedburner:feedFlare><feedburner:feedFlare href="http://www.flurry.com/pushRssFeed.do?r=fb&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fburncsharp" src="http://www.flurry.com/images/flurry_rss_logo2.gif">Subscribe with Flurry</feedburner:feedFlare><item><title>Things to know for hosting your ASP.NET MVC app</title><link>http://feeds.feedburner.com/~r/burncsharp/~3/327974095/things-to-know-for-hosting-your-asp-net-mvc-app.aspx</link><pubDate>Sun, 06 Jul 2008 09:43:32 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6366083</guid><dc:creator>mehfuzh</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://weblogs.asp.net/mehfuzh/rsscomments.aspx?PostID=6366083</wfw:commentRss><comments>http://weblogs.asp.net/mehfuzh/archive/2008/07/06/things-to-know-for-hosting-your-asp-net-mvc-app.aspx#comments</comments><description>&lt;p&gt;When you are planning to host your asp.net MVC application under IIS7 integrated mode environment. There are few easy tweaks that can make your application or starter kit work right out of the box but also can save a lot of your time finding things out.&lt;/p&gt;  &lt;p&gt;You might see a Http 404 page if default document is not configured properly. One way of getting this around by using the following in global.asax during the App_BeginRequest&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (Context.Request.FilePath == &lt;span class="str"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;) Context.RewritePath(&lt;span class="str"&gt;&amp;quot;Default.aspx&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

&lt;p&gt;&lt;span class="kwrd"&gt;But rater doing code changes, another easy way of achieving it by adding the following snippet in your web.config&lt;/span&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;defaultDocument&lt;/span&gt; &lt;span class="attr"&gt;enabled&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;files&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;clear&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Default.aspx&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;files&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;defaultDocument&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Relative urls like one that is shown below&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;img&lt;/span&gt; &lt;span class="attr"&gt;alt&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Flickr Logo&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;/Views/Shared/images/flickr_logo.gif&amp;quot;&lt;/span&gt;&amp;quot; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;


.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; }&lt;/style&gt;

&lt;p&gt;This will result in invalid output when the app is hosted under IIS7 and if it is hosted under a virtual directory&amp;#160; for example, http://localhost/flickrweb. It will produce url&amp;#160; &lt;em&gt;http://localhost/Views/Shared/images/flickr_logo.gif&lt;/em&gt; rather the original &lt;em&gt;http://localhost/ flickrweb/Views/Shared/images/flickr_logo.gif&lt;/em&gt;. To overcome this we would need to use &lt;em&gt;Page.ResolveClientUrl&lt;/em&gt;&amp;#160; which makes the above snippet look like&lt;style type="text/css"&gt;


.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; }&lt;/style&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;img&lt;/span&gt; &lt;span class="attr"&gt;alt&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Flickr Logo&amp;quot;&lt;/span&gt;
 &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;&amp;lt;%= Page.ResolveClientUrl(&amp;quot;&lt;/span&gt;~/&lt;span class="attr"&gt;Views&lt;/span&gt;/&lt;span class="attr"&gt;Shared&lt;/span&gt;/&lt;span class="attr"&gt;images&lt;/span&gt;/&lt;span class="attr"&gt;flickr_logo&lt;/span&gt;.&lt;span class="attr"&gt;gif&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;quot;) %&amp;gt;&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;style type="text/css"&gt;


.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; }&lt;/style&gt;

&lt;p&gt;Now, while hosting our MVC app to a shared hosting server whether or not they provide us a wwwlogs folder, we can easily write down a custom HttpLog module for IIS7 integrated mode (blessing of integrated pipeline). On the Init method of the HttpModule we can add the following event mapping under which we can write our custom logging logic.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;context.LogRequest +=&lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler(context_LogRequest);&lt;/pre&gt;

&lt;p&gt;For, each http request this will be fired for IIS7 integrated mode and&amp;#160; we need to add the mapping for it in the following way. &lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;&amp;lt;ModuleName&amp;gt;&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;preCondition&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;integratedMode&amp;quot;&lt;/span&gt; 
&lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;&amp;lt;namespace&amp;gt;, &amp;lt;assembly&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;span class="kwrd"&gt;We might be using CSS handlers&amp;#160; that will be compressing the contents and combine cross browser CSS intelligently, like one I have posted few months back&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;a title="http://weblogs.asp.net/mehfuzh/archive/2008/01/25/keep-your-css-files-clean-with-a-tiny-httphandler.aspx" href="http://weblogs.asp.net/mehfuzh/archive/2008/01/25/keep-your-css-files-clean-with-a-tiny-httphandler.aspx"&gt;http://weblogs.asp.net/mehfuzh/archive/2008/01/25/keep-your-css-files-clean-with-a-tiny-httphandler.aspx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Make sure you have added the mapping for this as well properly under system.webserver node for integrated mode&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;&amp;lt;handlerName&amp;gt;&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;path&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;&amp;lt;path&amp;gt;.axd&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;verb&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;*&amp;quot;&lt;/span&gt;
 &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;&amp;lt;namespace&amp;gt;&amp;quot;&lt;/span&gt; 
 &lt;span class="attr"&gt;requireAccess&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Script&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;preCondition&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;integratedMode&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;


.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; }&lt;/style&gt;

&lt;p&gt;And of course add it with Page.ResolveClient url to make it an absolute work.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;link&lt;/span&gt; &lt;span class="attr"&gt;rel&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Stylesheet&amp;quot;&lt;/span&gt;
 &lt;span class="attr"&gt;href&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;&amp;lt;%= Page.ResolveClientUrl(&amp;quot;&lt;/span&gt;~/&lt;span class="attr"&gt;CSSHander&lt;/span&gt;.&lt;span class="attr"&gt;axd&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;quot;) %&amp;gt;&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/css&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Now, hosting extension less web app is all beauty but how if someone tries to overload your server by manually hitting /Views/Controller/SomePage.aspx. We can make sure of it that no &lt;strong&gt;.aspx&lt;/strong&gt; file is ever processed by manual hits, by putting an extra web.config file under /Views folder of you ASP.NET MVC application and adding this tiny line inside it&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;InvalidAspxHandler&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;path&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;*.aspx&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;verb&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;*&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;preCondition&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;integratedMode&amp;quot;&lt;/span&gt; 
&lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;System.Web.HttpNotFoundHandler, System.Web, Version=2.0.0.0, Culture=neutral
, PublicKeyToken=b03f5f7f11d50a3a&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Now, all the config changes I have shown here are to be added under &lt;em&gt;system.webserver&lt;/em&gt; node to work with IIS7 integrated mode. The typical webserver node for IIS7 integrated mode looks like&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;system.webServer&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;validation&lt;/span&gt; &lt;span class="attr"&gt;validateIntegratedModeConfiguration&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;modules&lt;/span&gt; &lt;span class="attr"&gt;runAllManagedModulesForAllRequests&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;handlers&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;system.webServer&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Enjoy!!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f07%2f06%2fthings-to-know-for-hosting-your-asp-net-mvc-app.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f07%2f06%2fthings-to-know-for-hosting-your-asp-net-mvc-app.aspx" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6366083" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=rcKXxJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=rcKXxJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=GznROJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=GznROJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=3IF2VJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=3IF2VJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=zT8gPj"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=zT8gPj" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burncsharp/~4/327974095" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/MVC/default.aspx">MVC</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/AspNetMvc/default.aspx">AspNetMvc</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/FlickrXplorer/default.aspx">FlickrXplorer</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/IIS7/default.aspx">IIS7</category><feedburner:origLink>http://weblogs.asp.net/mehfuzh/archive/2008/07/06/things-to-know-for-hosting-your-asp-net-mvc-app.aspx</feedburner:origLink></item><item><title>Implement Master-Detail layout with ASP.NET MVC</title><link>http://feeds.feedburner.com/~r/burncsharp/~3/322757972/implement-master-detail-layout-with-asp-net-mvc.aspx</link><pubDate>Sun, 29 Jun 2008 19:48:43 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6336439</guid><dc:creator>mehfuzh</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://weblogs.asp.net/mehfuzh/rsscomments.aspx?PostID=6336439</wfw:commentRss><comments>http://weblogs.asp.net/mehfuzh/archive/2008/06/30/implement-master-detail-layout-with-asp-net-mvc.aspx#comments</comments><description>&lt;p&gt;This is the first of posts that I am making to show out the things you can do with ASP.NET MVC. Also, it shows what I have done while building &lt;a href="http://www.codeplex.com/FlickrXplorer" target="_blank"&gt;FlickrXplorer&lt;/a&gt;. I am bit lazy to write one article for it, so I thought rather to start it here.&lt;/p&gt;  &lt;p&gt;In this post, I will show how you can implement a master-detail layout that invokes MVC controller to process its data and uses Ajax to do it in a non postback manner.&lt;/p&gt;  &lt;p&gt;If you have looked though &lt;a href="http://www.codeplex.com/FlickrXplorer" target="_blank"&gt;FlickrXplorer&lt;/a&gt;, you must have noticed that every list of images is tied with a detail view in a way that if user performs any action on the list (&amp;quot;click&amp;quot;) , the detail view is updated accordingly. &lt;/p&gt;  &lt;p&gt;Let's see the action flow below&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/ImplementMasterDetaillayou.netMVCandajax_120C0/image_10.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="329" alt="image" src="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/ImplementMasterDetaillayou.netMVCandajax_120C0/image_thumb_4.png" width="463" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;It is almost clear that when you select an image it calls a Controller method or an Action method to be more precise. In this case, let's say that it is /Photo/Detail/112233. To map this a simple line in global.asax follows&lt;/p&gt;  &lt;pre class="csharpcode"&gt;routes.MapRoute(&lt;span class="str"&gt;&amp;quot;Detail&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Photo/Detail/{photoId}&amp;quot;&lt;/span&gt;,
 &lt;span class="kwrd"&gt;new&lt;/span&gt; { controller = &lt;span class="str"&gt;&amp;quot;Photo&amp;quot;&lt;/span&gt;, action = &lt;span class="str"&gt;&amp;quot;Detail&amp;quot;&lt;/span&gt; });&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;
&lt;style type="text/css"&gt;



.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; }&lt;/style&gt;

&lt;p&gt;This will result in the call of &lt;em&gt;PhotoController.Detail&lt;/em&gt;, when user hits the above url. Inside detail view its pretty simple.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;[FilterResponse]
&lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Detail(&lt;span class="kwrd"&gt;string&lt;/span&gt; photoId)
{
    &lt;span class="kwrd"&gt;try&lt;/span&gt;
    {
        PhotoDetail detail = model.GetPhoto(photoId); 
        &lt;span class="kwrd"&gt;return&lt;/span&gt; View(detail);
    }
    &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
    {
        &lt;span class="kwrd"&gt;return&lt;/span&gt; View(&lt;span class="str"&gt;&amp;quot;Error&amp;quot;&lt;/span&gt;, 
&lt;span class="kwrd"&gt;                    new&lt;/span&gt; ControllerException
      { ErrorUrl = HttpContext.Request.RawUrl, Message = ex.Message });
    }
}&lt;/pre&gt;

&lt;p&gt;As, expected it calls the model to get the photo and returns the &lt;em&gt;ViewResult&lt;/em&gt;. Here, I haven't done any content related processing rather made a ViewPage named Detail.aspx which the MVC framework calls. By default, MVC framework looks for the ViewPage or ViewControl with name equals to the Action name, but &lt;em&gt;View&lt;/em&gt; has other overrides that let me call other ViewPage/ViewControl as well. This is what done above when any error occurs, which calls Shared/Error.aspx. It is to be noted that if you have multiple controller and you want to access the same view from different controller, then you need to place it in the &lt;em&gt;Shared&lt;/em&gt; folder, which will make it accessible by all controllers. &lt;/p&gt;

&lt;p&gt;In the snippet, we also see that there is a FilterResponse attribute that will cache the response for same parameter set once the first call is made. FlickrResponse is inherited from MVC.ActionFilterAttribute attribute that provides a way to do some custom actions like caching and compression of http content.&lt;/p&gt;

&lt;p&gt;So far, I have mapped the url and added the action method. Now, its time to get the result and show them in UI but I don't want any postbacks or redirects for it. So, I have used a callback model that did the work for me.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; renderContent(elementId, loadElementId, url, callback) {
    &lt;span class="kwrd"&gt;var&lt;/span&gt; element = $get(elementId);
    $get(loadElementId).style.display = &lt;span class="str"&gt;&amp;quot;block&amp;quot;&lt;/span&gt;;

    &lt;span class="rem"&gt;// Create the WebRequest object.&lt;/span&gt;
    &lt;span class="kwrd"&gt;var&lt;/span&gt; wRequest = &lt;span class="kwrd"&gt;new&lt;/span&gt; Sys.Net.WebRequest();

    &lt;span class="rem"&gt;// Set the request Url.  &lt;/span&gt;
    wRequest.set_url(url);
    &lt;span class="rem"&gt;// Set the request verb.&lt;/span&gt;
    wRequest.set_httpVerb(&lt;span class="str"&gt;&amp;quot;GET&amp;quot;&lt;/span&gt;);
    &lt;span class="rem"&gt;// Set the Completed event handler, &lt;/span&gt;
    &lt;span class="rem"&gt;// for processing return data&lt;/span&gt;
    wRequest.add_completed(&lt;span class="kwrd"&gt;function&lt;/span&gt;(sender, eventArgs) 
    {
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (sender.get_responseAvailable()) 
        {
            element.innerHTML = sender.get_responseData();
            $get(loadElementId).style.display = &lt;span class="str"&gt;&amp;quot;none&amp;quot;&lt;/span&gt;;
            
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;typeof&lt;/span&gt; callback != &lt;span class="str"&gt;'undefined'&lt;/span&gt;)
                callback();
            
        }
    });
    &lt;span class="rem"&gt;// Make the request.&lt;/span&gt;
    wRequest.invoke();
}&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;style type="text/css"&gt;



.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; }&lt;/style&gt;&lt;/p&gt;

&lt;p&gt;Here, we see that &lt;em&gt;renderContent&lt;/em&gt; takes in the Id of the element that will contain the rendered content and loading element that will be visible while the content is being processed. Optionally, we can pass in a parameter-less void callback which can be invoked after the content is processed. In that case, we might like to start the loading of comments after we have rendered the detail page. This &lt;em&gt;renderContent&lt;/em&gt; is invoked while a user selects a photo from the list, this is a bit generic method which can be used for any callback scenarios. Therefore, for rendering photo detail, I wrapped it around so that it takes only a photoId. &lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; renderDeail(photoId, ignoreHash) {
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (ignoreHash == 0) {
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (window.location.hash == &lt;span class="str"&gt;''&lt;/span&gt;) {
            &lt;span class="rem"&gt;// take the default one &lt;/span&gt;
            window.location.hash = photoId;
        }
        &lt;span class="kwrd"&gt;else&lt;/span&gt; {
            photoId = getPhotoIdFromHash();
        }
    }
    &lt;span class="kwrd"&gt;else&lt;/span&gt; {
        window.location.hash = photoId;
    }
    &lt;span class="kwrd"&gt;var&lt;/span&gt; url = &lt;span class="str"&gt;'&amp;lt;%= Html.ActionUrl(&amp;quot;Photo&amp;quot;, &amp;quot;Detail&amp;quot;, new { photoId = &amp;quot;{0}&amp;quot; }) %&amp;gt;'&lt;/span&gt;;
    url = String.format(unescape(url), photoId);
    renderContent(&lt;span class="str"&gt;&amp;quot;detailView&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;loadingView&amp;quot;&lt;/span&gt;, url, loadComments);
}&lt;/pre&gt;

&lt;p&gt;&lt;style type="text/css"&gt;



.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; }&lt;/style&gt;&lt;em&gt;renderDetail&lt;/em&gt;&amp;#160; takes a photoId and ignoreHash := true/false. Inside, it uses Html.ActionUrl to process the url and then formats it with photoId and finally calls the &lt;em&gt;renderContent&lt;/em&gt;. Html.ActionUrl is an extension method which is coded by me, the original is Html.ActionLink. So please dont get confused :-). I could have passed the url by hand but using ActionUrl&amp;#160; it creates the url on basis of the route mapping in global.asax. Also, for Photo controller if I change the url from /photo/detail/id to /p/detail/id, then I don't have to go everywhere in order to change the references.&lt;/p&gt;

&lt;p&gt;Finally, while loading photo from url, I use &lt;em&gt;window.hash&lt;/em&gt; to navigate to the selected photo, which is updated when a photo is clicked to show and thus, I have the master-detail layout yet url copy-paste facility.&lt;/p&gt;

&lt;p&gt;That's it for now, I leave it on to the reader to explore it more in &lt;a href="http://www.codeplex.com/flickrXplorer" target="_blank"&gt;Codeplex&lt;/a&gt;. Also, hope that the introduction helps. Please note that some of the features like 2nd step loading of comments will be supported from 1.2 release (please check it out), so the JS might slightly differ to what is shown here.&lt;/p&gt;

&lt;p&gt;Check it live at &lt;a href="http://www.flickrmvc.net" target="_blank"&gt;www.flickrmvc.net&lt;/a&gt; - send me feedbacks and updates.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f06%2f30%2fimplement-master-detail-layout-with-asp-net-mvc.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f06%2f30%2fimplement-master-detail-layout-with-asp-net-mvc.aspx" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6336439" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=zxUlOI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=zxUlOI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=J1JNmI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=J1JNmI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=zsAF3I"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=zsAF3I" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=vFwEPi"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=vFwEPi" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burncsharp/~4/322757972" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/Linq.Flickr/default.aspx">Linq.Flickr</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/Ajax/default.aspx">Ajax</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/AspNetMvc/default.aspx">AspNetMvc</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/FlickrXplorer/default.aspx">FlickrXplorer</category><feedburner:origLink>http://weblogs.asp.net/mehfuzh/archive/2008/06/30/implement-master-detail-layout-with-asp-net-mvc.aspx</feedburner:origLink></item><item><title>Replace SortedDictionary with LINQ query - Part 2 (with comparison)</title><link>http://feeds.feedburner.com/~r/burncsharp/~3/314056563/replace-sorteddictionary-with-linq-query-part-2-with-comparison.aspx</link><pubDate>Tue, 17 Jun 2008 20:09:16 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6287527</guid><dc:creator>mehfuzh</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://weblogs.asp.net/mehfuzh/rsscomments.aspx?PostID=6287527</wfw:commentRss><comments>http://weblogs.asp.net/mehfuzh/archive/2008/06/18/replace-sorteddictionary-with-linq-query-part-2-with-comparison.aspx#comments</comments><description>&lt;p&gt;In my previous &lt;a href="http://weblogs.asp.net/mehfuzh/archive/2008/06/17/replace-sorteddictionary-with-linq-query.aspx" target="_blank"&gt;post&lt;/a&gt;, I have said that using LINQ query instead of &lt;em&gt;SortedDictionary&lt;/em&gt; not only could be useful , elegant but also less processor intensive. In this post, I will show you a real comparison between the same the method but one with &lt;em&gt;SortedDictionary&lt;/em&gt; and other with LINQ &lt;em&gt;orderby&lt;/em&gt; query. I wrote a simple console application that mimics the action of &lt;em&gt;GetSignature&lt;/em&gt; in LINQ.Flickr. Here, I will focus only on the &lt;em&gt;sorting&lt;/em&gt; part that's why I removed the hashing and initialization of the method. &lt;/p&gt;  &lt;p&gt;So, lets assume there are 10 url pairs that we need to sort for getting the signature. So, we need to create an array of 8 items and the processing method inserts another 2 (api_key and method name). Finally, when I run the two routines and took a snapshot from &lt;strong&gt;jetbrain's&lt;/strong&gt; &lt;strong&gt;dottrace , &lt;/strong&gt;I saw the following&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/ReplaceSortedDictionarywithLINQqueryPart_8A8/comparisonInit_1.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="127" alt="comparisonInit" src="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/ReplaceSortedDictionarywithLINQqueryPart_8A8/comparisonInit_thumb_1.jpg" width="508" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Now, you can see that there are two methods &lt;em&gt;TestSortedItemsWithSortedDic(SortedDictionary)&lt;/em&gt; and &lt;em&gt;TestSortedItems&lt;/em&gt; (LINQ). The difference is almost 3 times the LINQ &lt;em&gt;orderby&lt;/em&gt; query. Expanding the &lt;em&gt;TestSortedItemsWithSortedDic &lt;/em&gt;will reveal the following&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/ReplaceSortedDictionarywithLINQqueryPart_8A8/sorted_2.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="263" alt="sorted" src="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/ReplaceSortedDictionarywithLINQqueryPart_8A8/sorted_thumb_2.jpg" width="527" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;As you can see that adding items into sorted dictionary takes around 6.37% of the CPU cycle which is definitely because of the sort algorithm that it runs on each add. Also, there is another 1.39% during the initialization. Only these two items take up 7.76%, let alone the other &lt;em&gt;SortedDictionary&lt;/em&gt; entries. Now, lets see how the processing with LINQ &lt;em&gt;orderby&lt;/em&gt; looks like&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/ReplaceSortedDictionarywithLINQqueryPart_8A8/LINQ_1.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="165" alt="LINQ" src="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/ReplaceSortedDictionarywithLINQqueryPart_8A8/LINQ_thumb_1.jpg" width="536" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;LINQ iteration takes up 1.77%(where the original execution take place) , &lt;em&gt;Dictionary.Add&lt;/em&gt; takes 0.54% comparing to 6.37% with sorted dictionary and additional &lt;em&gt;orderby&lt;/em&gt; and &lt;em&gt;select &lt;/em&gt;take 0.17 and 0.14% respectively. So, in total &lt;em&gt;add&lt;/em&gt; and sorting &lt;em&gt;takes&lt;/em&gt; up to (1.77 + 0.54 + 0.17 + 0.14) 3.39% of CPU cycles. Here to include that, highest CPU index may vary with current load, but the ratio remains almost the same.&lt;/p&gt;  &lt;p&gt;Therefore, it is almost clear that we can replace &lt;em&gt;SortedDictionary&lt;/em&gt; with LINQ and without it .stripped down version of .net in Silverlight is not a bad idea :-). Also, those who commented on my last post for live comparison thank you !!. You can also download the test code I have used &lt;a href="http://weblogs.asp.net/mehfuzh/ProcessTest.zip" target="_blank"&gt;here&lt;/a&gt; and run it in dottrace to see it live (I have used dottrace 3.1). &lt;/p&gt;  &lt;p&gt;Have fun!!&lt;/p&gt; &lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f06%2f18%2freplace-sorteddictionary-with-linq-query-part-2-with-comparison.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f06%2f18%2freplace-sorteddictionary-with-linq-query-part-2-with-comparison.aspx" border="0" /&gt;&lt;/a&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6287527" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=auTcsI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=auTcsI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=ONIZXI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=ONIZXI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=VPoohI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=VPoohI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=DumR6i"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=DumR6i" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burncsharp/~4/314056563" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/Linq.Flickr/default.aspx">Linq.Flickr</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/dottrace/default.aspx">dottrace</category><feedburner:origLink>http://weblogs.asp.net/mehfuzh/archive/2008/06/18/replace-sorteddictionary-with-linq-query-part-2-with-comparison.aspx</feedburner:origLink></item><item><title>Replace SortedDictionary with LINQ query</title><link>http://feeds.feedburner.com/~r/burncsharp/~3/313230660/replace-sorteddictionary-with-linq-query.aspx</link><pubDate>Mon, 16 Jun 2008 18:43:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6283174</guid><dc:creator>mehfuzh</dc:creator><slash:comments>4</slash:comments><wfw:commentRss>http://weblogs.asp.net/mehfuzh/rsscomments.aspx?PostID=6283174</wfw:commentRss><comments>http://weblogs.asp.net/mehfuzh/archive/2008/06/17/replace-sorteddictionary-with-linq-query.aspx#comments</comments><description>&lt;p&gt;With &lt;a href="http://www.codeplex.com/LINQFlickr" target="_blank"&gt;LINQ.Flickr&lt;/a&gt; it is quite necessary to get signature on parameters in order to do authenticated flickr photo get. As with the signature, it has to be sorted by parameter then to be hashed by MD5. Previously, I used to use SortedDictionary dictionary to do so, but thinking a little bit I learned that we actually don't need SortedDictionary anymore after we have LINQ. May be that's why the product team at Microsoft removed SortedDictionary from stripped down version of .net that comes with SilverLight. &lt;/p&gt;  &lt;p&gt;Now, off to code, lets say I want 10 photos from my photo stream in flickr, to achieve that&amp;#160; I would simply write&lt;/p&gt;  &lt;pre class="csharpcode"&gt;var query = (from photo &lt;span class="kwrd"&gt;in&lt;/span&gt; context.Photos
            &lt;span class="kwrd"&gt;where&lt;/span&gt; photo.ViewMode == ViewMode.Owner
            select photo).Take(10);&lt;/pre&gt;

&lt;p&gt;Behind the scene, it will first try to authenticate me, if I am not already then it will try to do it and finally it will make an authenticated call to get my photos from my flickr account. Using SortedDictionary, the sorting of signature items used to be done on the fly but the overhead is that on every new item inserted in the dictionary due to each parameter of REST call, it runs the sort logic. This is of course a waste of processor speed. So, I replaced all the lines that look like &lt;/p&gt;

&lt;pre class="csharpcode"&gt;IDictionary&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; sortedSigItems 
= &lt;span class="kwrd"&gt;new&lt;/span&gt; SortedDictionary&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;();&lt;/pre&gt;
&lt;style type="text/css"&gt;




.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; }&lt;/style&gt;

&lt;p&gt;with &lt;/p&gt;

&lt;pre class="csharpcode"&gt;IDictionary&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; sigItems = &lt;span class="kwrd"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;();&lt;/pre&gt;

&lt;p&gt;Finally, inside my GetSignature method at BaseRepository of LINQ.Flickr I added the following lines, before final toString stuff.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;var query = from sigItem &lt;span class="kwrd"&gt;in&lt;/span&gt; sigItems
            orderby sigItem .Key ascending
            select sigItem.Key + sigItem .Value;

&lt;font color="#008000"&gt;// do the rest with sorted list.&lt;/font&gt;&lt;/pre&gt;

&lt;p&gt;The whole thing is much pleasing with LINQ query and less processor intensive.So next time when you think about sorting, think about LINQ first :-)&lt;/p&gt;

&lt;p&gt;Have fun!!!&lt;/p&gt;

&lt;p&gt;&lt;font color="#ff0000"&gt;Continued with comparison in part 2 of this post.&lt;/font&gt;&lt;/p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f06%2f17%2freplace-sorteddictionary-with-linq-query.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f06%2f17%2freplace-sorteddictionary-with-linq-query.aspx" border="0" /&gt;&lt;/a&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6283174" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=bM5R7I"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=bM5R7I" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=QbshQI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=QbshQI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=71nFaI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=71nFaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=gBul7i"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=gBul7i" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burncsharp/~4/313230660" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/Linq.Flickr/default.aspx">Linq.Flickr</category><feedburner:origLink>http://weblogs.asp.net/mehfuzh/archive/2008/06/17/replace-sorteddictionary-with-linq-query.aspx</feedburner:origLink></item><item><title>Flickr web app with MVC preview 3 [Cont..]</title><link>http://feeds.feedburner.com/~r/burncsharp/~3/301736697/flickr-web-app-with-mvc-preview-3-cont.aspx</link><pubDate>Sat, 31 May 2008 07:43:18 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6236287</guid><dc:creator>mehfuzh</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://weblogs.asp.net/mehfuzh/rsscomments.aspx?PostID=6236287</wfw:commentRss><comments>http://weblogs.asp.net/mehfuzh/archive/2008/05/31/flickr-web-app-with-mvc-preview-3-cont.aspx#comments</comments><description>&lt;p&gt;In my last post, I have mentioned of creating Flickr app with Asp.net MVC. In recent update I have modified it with Asp.net MVC Preview 3.&lt;/p&gt;  &lt;p&gt;You can find a general reference about the project &lt;a href="http://weblogs.asp.net/mehfuzh/archive/2008/05/27/flickr-viewer-an-asp-net-mvc-photo-app-for-flickr.aspx" target="_blank"&gt;here&lt;/a&gt;. But in this post, I will say, what are the changes due to the new release and where to start especially.&lt;/p&gt;  &lt;p&gt;In previous release of ASP.net MVC you had &lt;em&gt;RenderView&lt;/em&gt;, which lets you render your UI right from the controller and controller classes are with &lt;em&gt;void&lt;/em&gt; return type, now with new release this is slightly changed. In case of the FLickrViewer app, I have a PhotoController, where I did the following changes.&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Tags(&lt;span class="kwrd"&gt;string&lt;/span&gt; name, &lt;span class="kwrd"&gt;int&lt;/span&gt;? page)
{
    ViewData[&lt;span class="str"&gt;&amp;quot;Title&amp;quot;&lt;/span&gt;] = name;

    PhotoData photoData = &lt;span class="kwrd"&gt;new&lt;/span&gt; PhotoData();
    
    &lt;span class="rem"&gt;// ........ more code here  ......&lt;/span&gt;

    &lt;span class="kwrd"&gt;return&lt;/span&gt; View(photoData);
}&lt;/pre&gt;
&lt;style type="text/css"&gt;



.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; }&lt;/style&gt;

&lt;p&gt;As you can see, the data is passed as ActionResult by a &lt;em&gt;View&lt;/em&gt; routine, in this way it becomes more TDD friendly, where I don't need to mock HttpContext to compare results from Test class. From UI layer. Also, it lets you have different sets of results in ViewData. For example, i want to populate View's Title property from &lt;em&gt;ViewDataDictionary&lt;/em&gt; and get the tags from its &lt;em&gt;Model&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Therefore, I can do the following to have dynamic browser title&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; Photos for tag - &lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;= ViewData[&lt;span class="str"&gt;&amp;quot;Title&amp;quot;&lt;/span&gt;] &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;And, then access the Model property to get PhotoData.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt; 
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (ViewData.Model != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
    {
        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (FlickrViewer.Web.Objects.PopularTag tag &lt;span class="kwrd"&gt;in&lt;/span&gt; ViewData.Model)
        {
            &lt;span class="rem"&gt;// .. actual code&lt;/span&gt;
        }
    }&lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Pretty cool, in terms of separating result and UI data. :-).&amp;#160; Another good update is the routing helpers. We can now ignore particular URL extensions to be sent to controllers by &lt;em&gt;IgnoreRoutes&lt;/em&gt; and can use the new easy construct called MapRoute for mappping URLs to controllers.&lt;/p&gt;

&lt;p&gt;In global.asax, we can register and ignore routes like&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute(&lt;span class="str"&gt;&amp;quot;{resource}.axd/{*pathInfo}&amp;quot;&lt;/span&gt;);
    routes.MapRoute(&lt;span class="str"&gt;&amp;quot;Detail&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Photo.mvc/Detail/{photoId}&amp;quot;&lt;/span&gt;, 
                     &lt;span class="kwrd"&gt;new&lt;/span&gt; { controller = &lt;span class="str"&gt;&amp;quot;Photo&amp;quot;&lt;/span&gt;, action = &lt;span class="str"&gt;&amp;quot;Detail&amp;quot;&lt;/span&gt; });
}&lt;/pre&gt;
&lt;style type="text/css"&gt;

.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; }&lt;/style&gt;

&lt;p&gt;&lt;/p&gt;
&lt;style type="text/css"&gt;



.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; }&lt;/style&gt;

&lt;p&gt;These are few of loads of new additions to MVC Preview 3. In coming posts, I will tell more about how to use Ajax with MVC to construct master-detail UI, but you can check it out easily by digging into the source.&lt;/p&gt;

&lt;p&gt;The source can be divided into four parts&lt;/p&gt;

&lt;ol&gt;
  &lt;ol&gt;
    &lt;li&gt;UI - that uses Asp.net Ajax and JS and Html to render things out. &lt;/li&gt;

    &lt;li&gt;PhotoController - prepares the data for rendering. &lt;/li&gt;

    &lt;li&gt;PhotoModel -&amp;gt; talks with Flickr using &lt;a href="http://www.codeplex.com/LINQFlickr" target="_blank"&gt;LINQ.Flickr&lt;/a&gt;. &lt;/li&gt;

    &lt;li&gt;A separate test project that uses NUNIT and Rhino mock to test controller. &lt;/li&gt;
  &lt;/ol&gt;
&lt;/ol&gt;

&lt;p&gt;All together it makes out a MVC project :-). Again, get the copy of the source from &lt;a href="http://www.codeplex.com/flickrviewer"&gt;www.codeplex.com/flickrviewer&lt;/a&gt; and live URL is &lt;a href="http://flickrmvc.net"&gt;http://flickrmvc.net&lt;/a&gt;.&lt;style type="text/css"&gt;



.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; }&lt;/style&gt;&lt;style type="text/css"&gt;



.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; }&lt;/style&gt;&lt;/p&gt;

&lt;p&gt;Thanks&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f05%2f31%2fflickr-web-app-with-mvc-preview-3-cont.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f05%2f31%2fflickr-web-app-with-mvc-preview-3-cont.aspx" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6236287" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=LxHjvI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=LxHjvI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=UdRRfI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=UdRRfI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=ATzB2I"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=ATzB2I" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=ZY7Poi"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=ZY7Poi" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burncsharp/~4/301736697" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/LinqExtender/default.aspx">LinqExtender</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/Linq.Flickr/default.aspx">Linq.Flickr</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/MVC/default.aspx">MVC</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/Ajax/default.aspx">Ajax</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/AspNetMvc/default.aspx">AspNetMvc</category><feedburner:origLink>http://weblogs.asp.net/mehfuzh/archive/2008/05/31/flickr-web-app-with-mvc-preview-3-cont.aspx</feedburner:origLink></item><item><title>Flickr Xplorer - An Asp.net MVC photo app for Flickr</title><link>http://feeds.feedburner.com/~r/burncsharp/~3/298611488/flickr-viewer-an-asp-net-mvc-photo-app-for-flickr.aspx</link><pubDate>Mon, 26 May 2008 20:13:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6222819</guid><dc:creator>mehfuzh</dc:creator><slash:comments>5</slash:comments><wfw:commentRss>http://weblogs.asp.net/mehfuzh/rsscomments.aspx?PostID=6222819</wfw:commentRss><comments>http://weblogs.asp.net/mehfuzh/archive/2008/05/27/flickr-viewer-an-asp-net-mvc-photo-app-for-flickr.aspx#comments</comments><description>&lt;p&gt;I have flushed out a little project at Codeplex called &amp;quot;Flickr Xplorer&amp;quot;. Its a Flickr mesh up that lets you search(user, tag, text), jump into user photos, see popular and latest stream and moreover lets you browse the whole Flickr in hacked url way (url routing easy and rocking). The application is made on Asp.net MVC preview 3&amp;#160; and I have used my &lt;a href="http://www.codeplex.com/LINQFlickr" target="_blank"&gt;LINQ.Flickr&lt;/a&gt; to communicate with Flickr. The project is an early stage, I will update with new features when possible and how you ask. You can use it as you like , host it to your server to make it a personal dashboard for your taken photos or use it for fast hand on for Asp.net MVC , mocking and of course how to use LINQ.Flickr API :-)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/FlickerviewerAnAsp.netMVCapp_150D4/image_6.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="425" alt="image" src="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/FlickerviewerAnAsp.netMVCapp_150D4/image_thumb_2.png" width="502" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;you can try out the demo here &lt;a title="http://72.15.226.32/" href="http://flickrmvc.net/" target="_blank"&gt;http://flickrmvc.net/&lt;/a&gt; (sometimes service may be unavailable due to update pardon me for that). Currently, App is tested under IE 6 &amp;amp; 7, Firefox 2.0+, will update for other browsers as well.&lt;/p&gt;  &lt;p&gt;The location for the project&amp;#160; : &lt;a href="http://www.codeplex.com/flickrXplorer" target="_blank"&gt;www.codeplex.com/flickrXplorer&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Finally, have fun the new open source Flickr app and ping me if you have any suggestion to make it more interesting.&lt;/p&gt;  &lt;p&gt;Enjoy!!&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;Updated on 29th May 2008 - Asp.net MVC preview 3&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;Updated on 28th June 2008 - Restructured, renamed and added social features.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f05%2f27%2fflickr-viewer-an-asp-net-mvc-photo-app-for-flickr.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f05%2f27%2fflickr-viewer-an-asp-net-mvc-photo-app-for-flickr.aspx" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6222819" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=it4BTI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=it4BTI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=rU9BlI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=rU9BlI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=y7ItJI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=y7ItJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=2O5U1i"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=2O5U1i" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burncsharp/~4/298611488" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/Linq.Flickr/default.aspx">Linq.Flickr</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/MVC/default.aspx">MVC</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/Ajax/default.aspx">Ajax</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/AspNetMvc/default.aspx">AspNetMvc</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/FlickrXplorer/default.aspx">FlickrXplorer</category><feedburner:origLink>http://weblogs.asp.net/mehfuzh/archive/2008/05/27/flickr-viewer-an-asp-net-mvc-photo-app-for-flickr.aspx</feedburner:origLink></item><item><title>Mock HTTP layer to do complex tasks like uploading photo to Flickr</title><link>http://feeds.feedburner.com/~r/burncsharp/~3/284488931/mock-http-layer-to-do-complex-tasks-like-uploading-photo-to-flickr.aspx</link><pubDate>Tue, 06 May 2008 05:58:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6161511</guid><dc:creator>mehfuzh</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://weblogs.asp.net/mehfuzh/rsscomments.aspx?PostID=6161511</wfw:commentRss><comments>http://weblogs.asp.net/mehfuzh/archive/2008/05/06/mock-http-layer-to-do-complex-tasks-like-uploading-photo-to-flickr.aspx#comments</comments><description>&lt;P&gt;In this post, I will show how you can use Typemock to fake out complex HTTP POST like uploading photo in Flickr server. The example which will be shown here, gives a pretty much generic idea of faking out HTTP calls and gain access to the response stream for comparing result with original content.I have used, N-Unit along with Typemock which run thorough TMockRunner.exe to perform the mock test. &lt;/P&gt;
&lt;P&gt;To get started, let's see what is really cooking in &lt;EM&gt;PhotoRepository.Upload&lt;/EM&gt; in LINQ.Flickr which we are going to mock.&lt;/P&gt;&lt;A href="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/MockHTTPlayertodocomplextaskslikeuploadi_107E/image6.png" mce_href="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/MockHTTPlayertodocomplextaskslikeuploadi_107E/image6.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=468 alt=image src="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/MockHTTPlayertodocomplextaskslikeuploadi_107E/image6_thumb.png" width=476 border=0 mce_src="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/MockHTTPlayertodocomplextaskslikeuploadi_107E/image6_thumb.png"&gt;&lt;/A&gt; 
&lt;P&gt;To focus strictly on mocking,&amp;nbsp; I have removed non-mockable parts and blocked out sections to be mocked. These include the following&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;1. Mock calls to Authenticate.&lt;/P&gt;
&lt;P&gt;2. Get a mocked signature.&lt;/P&gt;
&lt;P&gt;3. Mock the HttpRequest object &lt;/P&gt;
&lt;P&gt;4. Get reference of the Stream so that Stream.Write&amp;nbsp; writes to our desired media rather to the original request stream.&lt;/P&gt;
&lt;P&gt;5. Create a Fake WebResponse object and marry it with Request.GetResponse&lt;/P&gt;
&lt;P&gt;6. Get reference of the response stream&amp;nbsp; that will be filled with data from local resource.&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Staring off every mock should have a MockManager.init(). we can further check if it is initialized or not by MockManager.Isinitialized.I have moved the common mock statements to a separate class for LINQ.Flickr which I call FakeFlickrReposity. It takes in the type of repository and the returned object and it can be constructed by a simple &lt;EM&gt;using&lt;/EM&gt; block as it implements IDisposable.&lt;/P&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; (FakeFlickrRepository&amp;lt;PhotoRepository, Photo&amp;gt; photoAddMock = 
&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; FakeFlickrRepository&amp;lt;PhotoRepository, Photo&amp;gt;()) 
{ 
   ... 
   ... 
}&lt;/PRE&gt;
&lt;P&gt;Inside it creates a Mock in its constructor of type PhotoRepository, the method of which(Also, its &lt;EM&gt;base&lt;/EM&gt;) to be mocked.&lt;/P&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; FakeFlickrRepository()
{
    _mockRepository = MockManager.Mock&amp;lt;T&amp;gt;(Constructor.NotMocked);
}&lt;/PRE&gt;
&lt;P&gt;The Constructor.NotMocked, means that the initialization codes for PhotoRepository wont be skipped. In this case creating the interface mapping to endpoint, getting keys, paths, etc.Now, going into the test class of LINQ.Flickr for uploading photo, I have first created the Photo object that has stream reference of a file from local resource.&lt;/P&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=rem&gt;//[Following block used in the full codeview at the bottom]&lt;/SPAN&gt;
Stream photoRes = 
GetResourceStream(&lt;SPAN class=str&gt;"Linq.Flickr.Test.blank.gif"&lt;/SPAN&gt;); 
Photo photo = 
&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Photo { Title = &lt;SPAN class=str&gt;"Flickr logo"&lt;/SPAN&gt;, FileName = &lt;SPAN class=str&gt;"Test.Mock"&lt;/SPAN&gt;,
File = photoRes, ViewMode = ViewMode.Public };&lt;/PRE&gt;
&lt;P&gt;Next, called the following &lt;/P&gt;&lt;PRE class=csharpcode&gt;photoAddMock.MockAuthenticateCall(&lt;SPAN class=kwrd&gt;true&lt;/SPAN&gt;, Permission.Delete);
photoAddMock.MockSignatureCall();&lt;/PRE&gt;
&lt;P&gt;Inside of &lt;EM&gt;MockAuthenticateCalls&lt;/EM&gt; looks like&lt;/P&gt;&lt;PRE class=csharpcode&gt;_mockRepository.
ExpectAndReturn(&lt;SPAN class=str&gt;"Authenticate"&lt;/SPAN&gt;, authToken)
.Args(validate, permission.ToString());&lt;/PRE&gt;
&lt;P&gt;And inside of &lt;EM&gt;MockSignatureCall&lt;/EM&gt;&lt;/P&gt;&lt;PRE class=csharpcode&gt;_mockRepository.ExpectAndReturn(&lt;SPAN class=str&gt;"GetSignature"&lt;/SPAN&gt;, signature);&lt;/PRE&gt;
&lt;P&gt;ExpectAndReturn , as it looks like, traps a method call and returns the result right away rather going to the original flow. &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE class=csharpcode&gt;photoAddMock.FakeHttpRequestObject(fileStream);&lt;/PRE&gt;
&lt;P&gt;The above line is for faking HTTPWebRequest and get a stream reference out of it. Stepping in which we can see&lt;/P&gt;&lt;PRE class=csharpcode&gt;_httpRequestMock = MockManager.Mock(&lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(HttpWebRequest)); A 
_httpRequestMock.ExpectSet(&lt;SPAN class=str&gt;"ContentType"&lt;/SPAN&gt;); B
_httpRequestMock.ExpectAndReturn(&lt;SPAN class=str&gt;"GetRequestStream"&lt;/SPAN&gt;, stream); C&lt;/PRE&gt;
&lt;P&gt;A =&amp;gt; Creates a mock of Type HttpWebRequest, B=&amp;gt; Sets an expectation of ContentType set, setting ContentType with mocked request will give a null reference as it depends on internal dictionary to do processing. C=&amp;gt; Sets an expection of GetRequestStream&amp;nbsp; and returns the reference to the stream provided from outside. &lt;/P&gt;&lt;PRE class=csharpcode&gt;photoAddMock.FakeWebResponse_GetResponse();&lt;/PRE&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This will create a MockObject of type WebResponse class and will return a dummy instance of it when HttpRequest.GetResponse will be invoked.&lt;/P&gt;&lt;PRE class=csharpcode&gt;_webResponseMock = MockManager.MockObject&amp;lt;WebResponse&amp;gt;();
_httpRequestMock.ExpectAndReturn(&lt;SPAN class=str&gt;"GetResponse"&lt;/SPAN&gt;, _webResponseMock.Object);&lt;/PRE&gt;
&lt;P&gt;_httpRequestMock&amp;nbsp; is the private Mock variable that we created earlier. We also need to fill up the Response stream with proper Flickr response to be parsed by the LINQ.Flcikr system properly , in case of successful upload. To archive that, we need to marry our local resource stream to the &lt;EM&gt;WebResponse.GetResponStream&lt;/EM&gt;&lt;/P&gt;&lt;PRE class=csharpcode&gt;_webResponseMock.
ExpectAndReturn(&lt;SPAN class=str&gt;"GetResponseStream"&lt;/SPAN&gt;, GetResourceStream(resource));
_webResponseMock.ExpectCall(&lt;SPAN class=str&gt;"Close"&lt;/SPAN&gt;);&lt;/PRE&gt;
&lt;P&gt;Finally, we need to make sure that response stream is closed properly. This is pretty much all which is to be mocked, the rest part of the code is to read the stream where the uploaded content is saved (pointed by us) and compare it with original photo binary. &lt;/P&gt;
&lt;P&gt;The part of the code is pasted here for more info of what I just said.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/MockHTTPlayertodocomplextaskslikeuploadi_107E/image_7.png" mce_href="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/MockHTTPlayertodocomplextaskslikeuploadi_107E/image_7.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=656 alt=image src="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/MockHTTPlayertodocomplextaskslikeuploadi_107E/image_thumb_2.png" width=390 border=0 mce_src="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/MockHTTPlayertodocomplextaskslikeuploadi_107E/image_thumb_2.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;This whole implementation can be found at &lt;EM&gt;LINQ.Flickr.Test&lt;/EM&gt; under PhotoMockTest :: DoPhotoUploadAndDeleteTest, which can be downloaded from &lt;A href="http://www.codeplex.com/linqflickr" mce_href="http://www.codeplex.com/linqflickr"&gt;www.codeplex.com/linqflickr&lt;/A&gt;. Have a nice day!!&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f05%2f06%2fmock-http-layer-to-do-complex-tasks-like-uploading-photo-to-flickr.aspx" mce_href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f05%2f06%2fmock-http-layer-to-do-complex-tasks-like-uploading-photo-to-flickr.aspx"&gt;&lt;IMG alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f05%2f06%2fmock-http-layer-to-do-complex-tasks-like-uploading-photo-to-flickr.aspx" border=0 mce_src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f05%2f06%2fmock-http-layer-to-do-complex-tasks-like-uploading-photo-to-flickr.aspx"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;STYLE type=text/css&gt;


.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; }&lt;/STYLE&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6161511" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=pfQ3HI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=pfQ3HI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=Yv2h9I"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=Yv2h9I" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=YeUpoI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=YeUpoI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=laKdxi"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=laKdxi" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burncsharp/~4/284488931" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/Linq.Flickr/default.aspx">Linq.Flickr</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/TypeMock/default.aspx">TypeMock</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/Unit+Test/default.aspx">Unit Test</category><feedburner:origLink>http://weblogs.asp.net/mehfuzh/archive/2008/05/06/mock-http-layer-to-do-complex-tasks-like-uploading-photo-to-flickr.aspx</feedburner:origLink></item><item><title>LINQ.Flickr 1.3</title><link>http://feeds.feedburner.com/~r/burncsharp/~3/283473647/linq-flickr-1-3.aspx</link><pubDate>Sun, 04 May 2008 19:33:02 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6157109</guid><dc:creator>mehfuzh</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://weblogs.asp.net/mehfuzh/rsscomments.aspx?PostID=6157109</wfw:commentRss><comments>http://weblogs.asp.net/mehfuzh/archive/2008/05/05/linq-flickr-1-3.aspx#comments</comments><description>&lt;p&gt;Just released another version of LINQ.Flickr. The release is out with several bug fixes, code optimization, new feature and overall mocking support. I have used Typemock for the unit test of the product. In coming posts, I will show how powerful mock can be in faking routine like upload photo. But, you can dig it right away, if you go by the release page and download a copy of the product. Truly speaking, testing was never fun for serviced API till mock engine is at my hand.&lt;/p&gt;  &lt;p&gt;The release is not all about re-factoring and mocking , but now you can query, add , delete photo comment , query people and popular tags and do more that are mentioned in the release page.&lt;/p&gt;  &lt;p&gt;Now, doing complex query is even more fun. lets take this.&lt;/p&gt;  &lt;pre class="csharpcode"&gt;var query = from photo &lt;span class="kwrd"&gt;in&lt;/span&gt; _context.Photos
&lt;span class="kwrd"&gt;where&lt;/span&gt; photo.Id == photoId &amp;amp;&amp;amp; photo.PhotoSize == PhotoSize.Medium
select &lt;span class="kwrd"&gt;new&lt;/span&gt; FlickrPhoto
{
    Id = photo.Id,
    Description = photo.Description,
    Title = photo.Title,
    Url = photo.Url,
    User = photo.User,
    Comments = ((from comment &lt;span class="kwrd"&gt;in&lt;/span&gt; _context.Photos.Comments
                 &lt;span class="kwrd"&gt;where&lt;/span&gt; comment.PhotoId == photoId
                 select &lt;span class="kwrd"&gt;new&lt;/span&gt; PhotoComment
                 {
                     Author = comment.Author,
                     AuthorName = comment.AuthorName,
                     PermaLink = comment.PermaLink,
                     PhotoId = comment.PhotoId,
                     Text = comment.Text,
                 }).ToList&amp;lt;PhotoComment&amp;gt;()),
    Tags = photo.PhotoTags.Select(tag =&amp;gt; tag.Title).ToArray&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;()
};&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;FlickrPhoto newPhoto = query.Single();&lt;/pre&gt;
&lt;style type="text/css"&gt;

.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; }&lt;/style&gt;

&lt;p&gt;The query is about getting the photo info for a specific photo id and I have now combined it with tags, comments to make it more useful. Also, few posts back, I have mentioned about using a RestToCollecitonBuilder&amp;#160; to build an object on REST response,&amp;#160; it is in action in this release as well.&lt;/p&gt;

&lt;p&gt;Finally, don't forget the link and it's &lt;a href="http://www.codeplex.com/linqflickr"&gt;www.codeplex.com/linqflickr&lt;/a&gt; . In the end, this project is not about querying Flickr and getting photo out of it, but it could be a great learning tool for Mocking, for building custom LINQ provider (with LinqExtender) and other things that you might need to know like, how to define a service endpoint by interface.&lt;/p&gt;

&lt;p&gt;Enjoy :-)&lt;/p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f05%2f05%2flinq-flickr-1-3.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f05%2f05%2flinq-flickr-1-3.aspx" border="0" /&gt;&lt;/a&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6157109" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=AveSRI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=AveSRI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=XdYpnI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=XdYpnI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=SAtQ6I"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=SAtQ6I" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=cG3RNi"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=cG3RNi" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burncsharp/~4/283473647" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/Linq.Flickr/default.aspx">Linq.Flickr</category><feedburner:origLink>http://weblogs.asp.net/mehfuzh/archive/2008/05/05/linq-flickr-1-3.aspx</feedburner:origLink></item><item><title>Code Snippet - A new way to share your codes.</title><link>http://feeds.feedburner.com/~r/burncsharp/~3/278917690/code-snippet-a-new-way-to-share-your-codes.aspx</link><pubDate>Sun, 27 Apr 2008 18:27:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6136423</guid><dc:creator>mehfuzh</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://weblogs.asp.net/mehfuzh/rsscomments.aspx?PostID=6136423</wfw:commentRss><comments>http://weblogs.asp.net/mehfuzh/archive/2008/04/28/code-snippet-a-new-way-to-share-your-codes.aspx#comments</comments><description>&lt;P&gt;Recently , we have added a new section at dotnetslackers by which you can share your code to public.&amp;nbsp; Now, &lt;EM&gt;code snippets&lt;/EM&gt; are tiny piece of code that can work as a unit, can come handy and be a real time-saver when building up complex solution or can be some interesting piece of lines which in turn can make out someone's day.&lt;/P&gt;
&lt;P&gt;To get started, lets go to&amp;nbsp; &lt;A href="http://www.dotnetslackers.com/" mce_href="http://www.dotnetslackers.com"&gt;www.dotnetslackers.com&lt;/A&gt;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;A href="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/CodeSnippetanewwaytoshareyourcode_14FAF/image_2.png" mce_href="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/CodeSnippetanewwaytoshareyourcode_14FAF/image_2.png"&gt;&lt;IMG height=240 alt=image src="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/CodeSnippetanewwaytoshareyourcode_14FAF/image_thumb.png" width=227 mce_src="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/CodeSnippetanewwaytoshareyourcode_14FAF/image_thumb.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Navigate to Community -&amp;gt; Code snippets. Here, either you can browse snippets posted by others and share your comments or hit on the "Add new" button to make one by yourself. It will firstly direct you to the login page, if you are not &lt;EM&gt;logged in&lt;/EM&gt; already. Finally, you will get a clean form to add your snippet and give some title, detail and tags for it and its done. &lt;/P&gt;
&lt;P&gt;&lt;A href="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/CodeSnippetanewwaytoshareyourcode_14FAF/image_10.png" mce_href="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/CodeSnippetanewwaytoshareyourcode_14FAF/image_10.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=229 alt=image src="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/CodeSnippetanewwaytoshareyourcode_14FAF/image_thumb_4.png" width=369 border=0 mce_src="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/CodeSnippetanewwaytoshareyourcode_14FAF/image_thumb_4.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Let us know, how do you feel about the new feature and what are the things you would love to see which will make it work for you. Anything you want to share, just write them down at &lt;/P&gt;
&lt;P&gt;&lt;A href="http://dotnetslackers.com/community/forums/t/1823.aspx" target=_blank mce_href="http://dotnetslackers.com/community/forums/t/1823.aspx"&gt;http://dotnetslackers.com/community/forums/t/1823.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Enjoy!!&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f04%2f28%2fcode-snippet-a-new-way-to-share-your-codes.aspx" mce_href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f04%2f28%2fcode-snippet-a-new-way-to-share-your-codes.aspx"&gt;&lt;IMG alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f04%2f28%2fcode-snippet-a-new-way-to-share-your-codes.aspx" border=0 mce_src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f04%2f28%2fcode-snippet-a-new-way-to-share-your-codes.aspx"&gt;&lt;/A&gt;&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6136423" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=N7umFI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=N7umFI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=MXbIWI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=MXbIWI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=lCDPiI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=lCDPiI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=X6a2di"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=X6a2di" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burncsharp/~4/278917690" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/dotnetSlackers/default.aspx">dotnetSlackers</category><feedburner:origLink>http://weblogs.asp.net/mehfuzh/archive/2008/04/28/code-snippet-a-new-way-to-share-your-codes.aspx</feedburner:origLink></item><item><title>Mocking static methods with Typemock</title><link>http://feeds.feedburner.com/~r/burncsharp/~3/274286383/mocking-static-methods-with-typemock.aspx</link><pubDate>Sun, 20 Apr 2008 21:37:01 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6116634</guid><dc:creator>mehfuzh</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://weblogs.asp.net/mehfuzh/rsscomments.aspx?PostID=6116634</wfw:commentRss><comments>http://weblogs.asp.net/mehfuzh/archive/2008/04/21/mocking-static-methods-with-typemock.aspx#comments</comments><description>&lt;p&gt;There are mocking tools like Rhino Mock, Moq, NMock, Typemock and many more. Recently, I was kinda evaluating mocking tools to mock out REST calls in Linq.Flickr. Almost all of the mock tools requires some sort of interface reference to work on. When, to mock out methods like XElement.Load or File.Open is impossible with most of the tools, Typemock is one step ahead of others as it supports mocking of static methods.&lt;/p&gt;  &lt;p&gt;Since, all the queries in Linq.Flickr goes through REST and all is tied with somehow with XElement.Load for getting the response in a LINQToXml fashion (I have mentioned already in my earlier posts, how :-)). I wanted to fake out the HTTP layer completely so that sitting in an airplane and with no Internet it is possible to test the product.&lt;/p&gt;  &lt;p&gt;Before going to any downloads , lets see how easy is Typemock in this regard.&lt;/p&gt;  &lt;p&gt;Now, all starts with a NUnit test class, where I have referenced the Typemock lib and during initialization of the test I faked out XElement.Load method for particular URL request to Flickr. Fragment of the code could be like&lt;/p&gt;  &lt;pre class="csharpcode"&gt;[SetUp]
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Initialize()
{
   ...
   ...
   &lt;span class="rem"&gt;// initialize mock &lt;/span&gt;
    MockManager.Init();

    &lt;span class="kwrd"&gt;string&lt;/span&gt; frobUrl = &lt;span class="str"&gt;&amp;quot;http://api.flickr.com/services/rest/?       
    method=flickr.auth.getFrob&amp;amp;api_key=xxxx
    &amp;amp;api_sig=cdeb9a73a771d5ea374d014680b33a0e&amp;quot;&lt;/span&gt;;
    &lt;span class="rem"&gt;// custom method to get element locally&lt;/span&gt;
    XElement element1 = MockElement(frobUrl, &lt;span class="str"&gt;&amp;quot;LinqToFlickrTest.GetFrob.xml&amp;quot;&lt;/span&gt;); 
    &lt;span class="rem"&gt;// create the mock object.&lt;/span&gt;
    Mock mock1 = MockManager.Mock(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(XElement));
    mock1.ExpectAndReturn(&lt;span class="str"&gt;&amp;quot;Load&amp;quot;&lt;/span&gt;, element1).When(frobUrl);
   ...
   ...
}&lt;/pre&gt;
&lt;style type="text/css"&gt;

.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; }&lt;/style&gt;

&lt;p&gt;So, I created a mock object of Type XElement and set it up for an URL so that when request comes in, it will return my response instead of looking into the sky for it. Finally, its all plain old test class, with no suspicious code :-)&lt;/p&gt;

&lt;pre class="csharpcode"&gt;[Test]
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Test()
{
    var query = from photo &lt;span class="kwrd"&gt;in&lt;/span&gt; _context.Photos
                &lt;span class="kwrd"&gt;where&lt;/span&gt; photo.SearchMode == SearchMode.TagsOnly 
                &amp;amp;&amp;amp; photo.SearchText == &lt;span class="str"&gt;&amp;quot;microsoft&amp;quot;&lt;/span&gt;
                select photo; 

    &lt;span class="kwrd"&gt;int&lt;/span&gt; count = query.Count(); 
   ...
   ...
}&lt;/pre&gt;
&lt;style type="text/css"&gt;

.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; }&lt;/style&gt;&lt;style type="text/css"&gt;

.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; }&lt;/style&gt;

&lt;p&gt;Additionally, its nice to check if all the mock worked out fine in &lt;em&gt;TearDown by MockManager.Verify&lt;/em&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;[TearDown]
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Verify()
{
    MockManager.Verify();
}&lt;/pre&gt;

&lt;p&gt;That's it , you can download a working sample &lt;a href="http://weblogs.asp.net/blogs/mehfuzh/LinqFlickrTest(Mock).zip" target="_blank"&gt;right here&lt;/a&gt;. If you have Typemock and NUnit installed, I have provided a .BAT for running NUnit through TMockRunner, change the paths accordingly to have it work for you.&lt;/p&gt;

&lt;p&gt;In the end, it is worth mentioning that currently Mock.&lt;em&gt;When &lt;/em&gt;is only supported in Typemock enterprise edition.Therefore, I will also wrap the dateaccess layer of &lt;a href="http://www.codeplex.com/LINQFlickr/" target="_blank"&gt;Linq.Flickr&lt;/a&gt; with interface reference so that it is possible to mock with others mocking tools as well and I will keep the code updated with latest changes so that you can play around it.&lt;/p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f04%2f21%2fmocking-static-methods-with-typemock.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f04%2f21%2fmocking-static-methods-with-typemock.aspx" border="0" /&gt;&lt;/a&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6116634" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=6SuTQI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=6SuTQI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=sGlLTI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=sGlLTI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=kEGTJI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=kEGTJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=U5PXei"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=U5PXei" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burncsharp/~4/274286383" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/Linq.Flickr/default.aspx">Linq.Flickr</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/LINQ+To+Xml/default.aspx">LINQ To Xml</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/TypeMock/default.aspx">TypeMock</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/Unit+Test/default.aspx">Unit Test</category><feedburner:origLink>http://weblogs.asp.net/mehfuzh/archive/2008/04/21/mocking-static-methods-with-typemock.aspx</feedburner:origLink></item><item><title>Multiple Item support for same property in where clause : LinqExtender</title><link>http://feeds.feedburner.com/~r/burncsharp/~3/264435584/multiple-item-support-for-same-property-in-where-clause-linqextender.aspx</link><pubDate>Sat, 05 Apr 2008 06:47:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6067942</guid><dc:creator>mehfuzh</dc:creator><slash:comments>4</slash:comments><wfw:commentRss>http://weblogs.asp.net/mehfuzh/rsscomments.aspx?PostID=6067942</wfw:commentRss><comments>http://weblogs.asp.net/mehfuzh/archive/2008/04/05/multiple-item-support-for-same-property-in-where-clause-linqextender.aspx#comments</comments><description>&lt;P&gt;Just a few days ago I have rolled up another patch for LinqExtender which is 1.3.2 , this is reported to me from a work item, especially to support the following query&lt;/P&gt;&lt;PRE class=csharpcode&gt;var query = from book &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; _context.Books
            &lt;SPAN class=kwrd&gt;where&lt;/SPAN&gt; book.PublishedDate &amp;gt; someDate 
            and book.PublishedDate &amp;lt; someDate
            select book;&lt;/PRE&gt;
&lt;STYLE type=text/css&gt;




.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; }&lt;/STYLE&gt;

&lt;STYLE type=text/css&gt;




.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; }&lt;/STYLE&gt;

&lt;P&gt;Here we can see that there are similar property is used for different segment in &lt;EM&gt;where&lt;/EM&gt; clause. Now, previously this kind of query used to fail tests as bucket.Items["SomeProperty"].Value and bucket.Items["SomeProperty"].RelationType only returns single &lt;EM&gt;item value&lt;/EM&gt; and &lt;EM&gt;relation type&lt;/EM&gt; respectively. Therefore, I have added a new property that will be used to handle multiple homogenous query conditions and which can be used&amp;nbsp; like the following&lt;/P&gt;&lt;PRE class=csharpcode&gt;IList&amp;lt;BucketItem.QueryCondition&amp;gt; conditions  = bucket.Items[&lt;SPAN class=str&gt;"SomeProperty"&lt;/SPAN&gt;].Values

&lt;SPAN class=kwrd&gt;foreach&lt;/SPAN&gt; (BucketItem.QueryCondtion condition &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; conditions)
{
  &lt;SPAN class=rem&gt;// do something precious with the value.&lt;/SPAN&gt;
  obj &lt;SPAN class=kwrd&gt;value&lt;/SPAN&gt; =  condition.Value;
  &lt;SPAN class=rem&gt;// contains less, equal, etc.&lt;/SPAN&gt;
  RelationType rel = condtion.RelationType; 
}&lt;/PRE&gt;
&lt;STYLE type=text/css&gt;



.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; }&lt;/STYLE&gt;

&lt;P&gt;In case, your data source don't have that capability for doing this kind of query , and you decide to stick to the single item getter, then the provider will gracefully give "not supported" exception rather than quietly failing the unit test :-). Again, its up to the user how they use it and hope it comes handy.&lt;/P&gt;&lt;A href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f04%2f05%2fmultiple-item-support-for-same-property-in-where-clause-linqextender.aspx" mce_href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f04%2f05%2fmultiple-item-support-for-same-property-in-where-clause-linqextender.aspx"&gt;&lt;IMG border=0 alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f04%2f05%2fmultiple-item-support-for-same-property-in-where-clause-linqextender.aspx" mce_src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f04%2f05%2fmultiple-item-support-for-same-property-in-where-clause-linqextender.aspx"&gt;&lt;/A&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6067942" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=y6AMEI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=y6AMEI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=ALViWI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=ALViWI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=ID7GgI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=ID7GgI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=fQwITi"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=fQwITi" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burncsharp/~4/264435584" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/LinqExtender/default.aspx">LinqExtender</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/LINQ+Provider+Toolkit/default.aspx">LINQ Provider Toolkit</category><feedburner:origLink>http://weblogs.asp.net/mehfuzh/archive/2008/04/05/multiple-item-support-for-same-property-in-where-clause-linqextender.aspx</feedburner:origLink></item><item><title>My MVP award</title><link>http://feeds.feedburner.com/~r/burncsharp/~3/262904221/my-mvp-award.aspx</link><pubDate>Wed, 02 Apr 2008 20:41:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6061840</guid><dc:creator>mehfuzh</dc:creator><slash:comments>12</slash:comments><wfw:commentRss>http://weblogs.asp.net/mehfuzh/rsscomments.aspx?PostID=6061840</wfw:commentRss><comments>http://weblogs.asp.net/mehfuzh/archive/2008/04/03/my-mvp-award.aspx#comments</comments><description>&lt;P&gt;I just came to know that I have been given the MVP award for 2008 that comes through the following line from a mail in my inbox.&lt;/P&gt;
&lt;P&gt;"&lt;EM&gt;Congratulations! We are pleased to present you with the 2008 Microsoft® MVP Award! The MVP Award is our way to say thank you for promoting the spirit of community and improving people’s lives and the industry’s success every day&lt;/EM&gt;"&lt;/P&gt;
&lt;P&gt;Formally, this award goes to my numerous readers, people who showed their support by downloading my projects, asking for fixes and reading my boring articles :-)&amp;nbsp; and more ... &lt;/P&gt;
&lt;P&gt;Finally, don't forget to try out the new release of &lt;A href="http://www.codeplex.com/LinqExtender" target=_blank mce_href="http://www.codeplex.com/LinqExtender"&gt;LinqExtender&lt;/A&gt;, I will post the detail in coming posts and few weeks ago I mentioned in my blog about Flickr MVC project with &lt;A href="http://www.codeplex.com/LINQFlickr" target=_blank mce_href="http://www.codeplex.com/LINQFlickr"&gt;Linq.Flickr&lt;/A&gt; that is coming to the end so watch it out as well.&lt;/P&gt;
&lt;P&gt;Technically, I am an MVP in Asp.net , but it could be nicer if there is one in LINQ as LINQ is common to both Asp.net and Windows clients. But in the end, recognition really makes thing better :-)&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6061840" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=Kk4iRI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=Kk4iRI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=su2RzI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=su2RzI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=U90x8I"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=U90x8I" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=A6ABri"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=A6ABri" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burncsharp/~4/262904221" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/LinqExtender/default.aspx">LinqExtender</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/MVP/default.aspx">MVP</category><feedburner:origLink>http://weblogs.asp.net/mehfuzh/archive/2008/04/03/my-mvp-award.aspx</feedburner:origLink></item><item><title>REST to collection builder using LINQ to XML</title><link>http://feeds.feedburner.com/~r/burncsharp/~3/260637377/rest-to-collection-builder-using-linq-to-xml.aspx</link><pubDate>Sun, 30 Mar 2008 08:57:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6048088</guid><dc:creator>mehfuzh</dc:creator><slash:comments>4</slash:comments><wfw:commentRss>http://weblogs.asp.net/mehfuzh/rsscomments.aspx?PostID=6048088</wfw:commentRss><comments>http://weblogs.asp.net/mehfuzh/archive/2008/03/30/rest-to-collection-builder-using-linq-to-xml.aspx#comments</comments><description>&lt;p&gt;Few weeks ago, I did a post about how can I handle REST response using LINQ To XML. You can take a look at it here.&lt;/p&gt;  &lt;p&gt;&lt;a title="http://weblogs.asp.net/mehfuzh/archive/2008/01/11/rest-with-linq-to-xml.aspx" href="http://weblogs.asp.net/mehfuzh/archive/2008/01/11/rest-with-linq-to-xml.aspx" mce_href="http://weblogs.asp.net/mehfuzh/archive/2008/01/11/rest-with-linq-to-xml.aspx"&gt;http://weblogs.asp.net/mehfuzh/archive/2008/01/11/rest-with-linq-to-xml.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Now , this is nice that we can parse REST response with LINQ To XML but at the same time it is kind of boring writing the mapping manually every time. In my &lt;a href="http://www.codeplex.com/LINQFlickr" target="_blank" mce_href="http://www.codeplex.com/LINQFlickr"&gt;Linq.Flckr&lt;/a&gt; project, I need to build objects from REST in various occasions, so its kind of monotonous as well as error prone writing the XML to Object Mapping manually, even its really easy to do using LINQ to XML. Therefore, I have come up with a tiny class that does the task for me and in return, all I have to do is to declare some attributes on top of my Class and Property.&lt;/p&gt;  &lt;p&gt;Once, I have added all the property mappings, all is left is to create the RestCollectionBuilder object and call the ToCollecton to get the IEnumreable&amp;lt;T&amp;gt; result from REST response.&lt;/p&gt;  &lt;pre class="csharpcode"&gt;RestToCollectionBuilder&amp;lt;SomeObject&amp;gt; builder = 
&lt;span class="kwrd"&gt;new&lt;/span&gt; RestToCollectionBuilder&amp;lt;SomeObject&amp;gt;();
OR
&lt;span class="rem"&gt;// pass the root element from which attributes &lt;/span&gt;
&lt;span class="rem"&gt;//will be passed to the SomeObject class.&lt;/span&gt;
RestToCollectionBuilder&amp;lt;SomeObject&amp;gt; builder =
 &lt;span class="kwrd"&gt;new&lt;/span&gt; RestToCollectionBuilder&amp;lt;SomeObject&amp;gt;(##ROOELEMENT##);
 &lt;span class="rem"&gt;// Where T: IDisposable&lt;/span&gt;
&lt;span class="rem"&gt;// Build the object.&lt;/span&gt;
IEnumerable&amp;lt;SomeObject&amp;gt; list = builder.ToCollection(##REQUESTURL##);
OR
&lt;span class="rem"&gt;// get the element and do some parse of your own, if needed.&lt;/span&gt;
XElement element = GetElement(..) 
IEnumerable&amp;lt;SomeObject&amp;gt; list = builder.ToCollection(element);&lt;style type="text/css"&gt;.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; }
&lt;/style&gt;&lt;/pre&gt;

&lt;p&gt;Talking about attributes and elements , let's consider the following REST response from Flickr .&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;rsp&lt;/span&gt; &lt;span class="attr"&gt;stat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ok&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;person&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;12037949754@N01&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;nsid&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;12037949754@N01&amp;quot;&lt;/span&gt;
 &lt;span class="attr"&gt;isadmin&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;ispro&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;iconserver&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;122&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;iconfarm&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt;
 &lt;span class="attr"&gt;gender&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;M&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;ignored&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;contact&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; 
&lt;span class="attr"&gt;friend&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;family&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;revcontact&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt;
 &lt;span class="attr"&gt;revfriend&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;revfamily&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;username&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;bees&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;username&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;realname&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Cal! Henderson@&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;realname&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;mbox_sha1sum&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;2971b1c2fd1d4f0e8f99c167cd85d522a614b07b&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;mbox_sha1sum&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;location&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;San Francisco, USA&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;location&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;photosurl&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;http://www.flickr.com/photos/bees/&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;photosurl&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;profileurl&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;http://www.flickr.com/people/bees/&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;profileurl&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;mobileurl&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;http://m.flickr.com/photostream.gne?id=287&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;mobileurl&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;person&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; 
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;rsp&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;

.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; }&lt;/style&gt;

&lt;p&gt;Here , we need to tell the Collection builder which element is mapped to which property.Accordingly, I have created some custom attributes that will be used by the builder to create the map. Which are &lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;XElementAttribute &lt;/li&gt;

  &lt;li&gt;XAttributeAttribute &lt;/li&gt;

  &lt;li&gt;XNameAttribtute &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first two attributes inherits the XNameAttribute. So, if our class is &lt;u&gt;People&lt;/u&gt; and we need to map the &lt;em&gt;person&lt;/em&gt; element and its descendants to it, our class will look like&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;// maps the element to which the class belongs to&lt;/span&gt;
[XElement(&lt;span class="str"&gt;&amp;quot;person&amp;quot;&lt;/span&gt;)] 
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Person
{
    &lt;span class="rem"&gt;// maps to &amp;lt;person nsId =&amp;quot;xx&amp;quot;&amp;gt;&lt;/span&gt;
    [XAttribute(&lt;span class="str"&gt;&amp;quot;nsid&amp;quot;&lt;/span&gt;)]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Id { get; set; }
   &lt;span class="rem"&gt;// maps to &amp;lt;person ispro =&amp;quot;True&amp;quot;&amp;gt;&lt;/span&gt;
    [XAttribute(&lt;span class="str"&gt;&amp;quot;ispro&amp;quot;&lt;/span&gt;)]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsPro { get; set; }
    &lt;span class="rem"&gt;// maps to &amp;lt;username&amp;gt;Henderson&amp;lt;/username&amp;gt;&lt;/span&gt;
    [XElement(&lt;span class="str"&gt;&amp;quot;username&amp;quot;&lt;/span&gt;)]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Username { get; set; }
   
   ....
   ....
   ....
}&lt;/pre&gt;
&lt;style type="text/css"&gt;


.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; }&lt;/style&gt;

&lt;p&gt;And that's all is needed to map the class to REST elements though under the hood, RestToCollectionBuilder class does use LINQ To XML to prepare the collection, but gives out a more strong solution to work with REST responses. I have used this technique in &lt;a href="http://www.codeplex.com/LINQFlickr" target="_blank" mce_href="http://www.codeplex.com/LINQFlickr"&gt;Linq.Flickr&lt;/a&gt;. You can check that out by digging in the code. Along with that, I have fused in a tiny Console App that processes the REST response, builds the object and dumps the result to the screen, you can &lt;a href="http://weblogs.asp.net/blogs/mehfuzh/RestToCollection.zip" mce_href="http://weblogs.asp.net/blogs/mehfuzh/RestToCollection.zip"&gt;download it here&lt;/a&gt; as well.&lt;/p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f03%2f30%2frest-to-collection-builder-using-linq-to-xml.aspx" mce_href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f03%2f30%2frest-to-collection-builder-using-linq-to-xml.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f03%2f30%2frest-to-collection-builder-using-linq-to-xml.aspx" mce_src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f03%2f30%2frest-to-collection-builder-using-linq-to-xml.aspx" /&gt;&lt;/a&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6048088" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=vdqcpI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=vdqcpI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=55E2SI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=55E2SI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=cljfXI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=cljfXI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=ZWYvxi"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=ZWYvxi" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burncsharp/~4/260637377" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/LINQ+To+Xml/default.aspx">LINQ To Xml</category><feedburner:origLink>http://weblogs.asp.net/mehfuzh/archive/2008/03/30/rest-to-collection-builder-using-linq-to-xml.aspx</feedburner:origLink></item><item><title>LinqExtender 1.3.1</title><link>http://feeds.feedburner.com/~r/burncsharp/~3/255952937/linqextender-1-3-1.aspx</link><pubDate>Sat, 22 Mar 2008 07:41:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6009810</guid><dc:creator>mehfuzh</dc:creator><slash:comments>4</slash:comments><wfw:commentRss>http://weblogs.asp.net/mehfuzh/rsscomments.aspx?PostID=6009810</wfw:commentRss><comments>http://weblogs.asp.net/mehfuzh/archive/2008/03/22/linqextender-1-3-1.aspx#comments</comments><description>&lt;P&gt;Last week, I have released a patch for LinqExtender project at Codeplex. You can find the full feature list at release page. One issue that I will talk about here is orderby clause and its related in-memory sort. &lt;/P&gt;
&lt;P&gt;Service based apps are of fixed set of operations. Now, it might happen that you need the list of most of popular photo tags from Flickr and you need to sort them by title as well. But, unfortunately you come to know that it has no parameter that sorts by title. &lt;/P&gt;
&lt;P&gt;Now , those who have played around the toolkit (since there are lots of downloads :-)) , must know that for the following query&lt;/P&gt;&lt;PRE class=csharpcode&gt;var query = from tag &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; _context.PopularTags&lt;BR&gt;            &lt;SPAN class=kwrd&gt;where&lt;/SPAN&gt; tag.Period == TagPeriod.Week orderby tag.Title ascending&lt;BR&gt;            select tag;&lt;/PRE&gt;
&lt;P&gt;I will have a Bucket.OrderByClause inside Query&amp;lt;T&amp;gt;.Process override. Bucket.OrderByClause has two properties (FieldName, IsAscending)&amp;nbsp; by which, we can understand the orderby query nature and take action on that. This is good , if external method that we are calling supports the orderby info. If not , then alternatively we can do something that follows&lt;/P&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=kwrd&gt;protected&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;override&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Process
(LinqExtender.Interface.IModify&amp;lt;T&amp;gt; items, Bucket bucket)
{
    IEnumerable&amp;lt;QueryObject&amp;gt; results = GetResult( ... );    
   &lt;SPAN class=rem&gt;// add the result to the extender collection, "true" defines that it should be &lt;/SPAN&gt;
   &lt;SPAN class=rem&gt;// be sorted by the orderby specified in query expression.    &lt;/SPAN&gt;
    items.AddRange(result, &lt;SPAN class=kwrd&gt;true&lt;/SPAN&gt;);         
}&lt;/PRE&gt;
&lt;DIV style="BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; MARGIN: 4px 0px 0px; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px" id=8f896844-79ed-4af8-bccc-c71b2ad14980 class=postBody contentEditable=true&gt;
&lt;STYLE type=text/css&gt;.csharpcode {
	FONT-SIZE: small; COLOR: black; FONT-FAMILY: consolas, "Courier New", courier, monospace; BACKGROUND-COLOR: #ffffff
}
.csharpcode PRE {
	FONT-SIZE: small; COLOR: black; FONT-FAMILY: consolas, "Courier New", courier, monospace; BACKGROUND-COLOR: #ffffff
}
.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 {
	MARGIN: 0em; WIDTH: 100%; BACKGROUND-COLOR: #f4f4f4
}
.csharpcode .lnum {
	COLOR: #606060
}
&lt;/STYLE&gt;
&lt;PRE class=csharpcode&gt;OR&lt;/PRE&gt;&lt;PRE class=csharpcode&gt;&lt;FONT color=#000000&gt;&lt;SPAN class=kwrd&gt;protected&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;override&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Process
(LinqExtender.Interface.IModify&amp;lt;T&amp;gt; items, Bucket bucket)
{
    &lt;SPAN class=kwrd&gt;foreach&lt;/SPAN&gt; (var item &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; unfilterItems) 
    { 
       &lt;SPAN class=rem&gt;// do some of work your own work&lt;/SPAN&gt;
       &lt;SPAN class=rem&gt;// finally add it to the collection&lt;/SPAN&gt;
       items.Add(item);
    }
    &lt;SPAN class=rem&gt;// sort the items if any orderby query is used &lt;/SPAN&gt;
   items.Sort();
}&lt;/FONT&gt;&lt;/PRE&gt;
&lt;P&gt;Either way , the result will be the same. As, it looks clear that it is doing in-memory sort. Therefore, you have to be careful on how much data you are performing this. Generally, this type of sort is best suited for predictable result sets.&lt;/P&gt;
&lt;P&gt;You have seen orderby clause in LINQ query here and there.But have you ever thought that someday when you will be writing your custom provider , how will you deal with it? The best case could be using IComparer implementation. Though, you can dig in the code to find the every detail of how I implemented it, in brief here how it works. &lt;/P&gt;
&lt;P&gt;In LinqExtender , I have created a class called QueryItemsComparer. As, I already build Bucket.OrderByClause object from query. All I needed to do the sort in base List&amp;lt;T&amp;gt; through this custom comparer. part of the code looks like&lt;/P&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt;.Sort(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; QueryItemComparer&amp;lt;T&amp;gt;&lt;BR&gt;(_queryObject.OrderByClause.FieldName, _queryObject.OrderByClause.IsAscending));&lt;/PRE&gt;
&lt;STYLE type=text/css&gt;.csharpcode {
	FONT-SIZE: small; COLOR: black; FONT-FAMILY: consolas, "Courier New", courier, monospace; BACKGROUND-COLOR: #ffffff
}
.csharpcode PRE {
	FONT-SIZE: small; COLOR: black; FONT-FAMILY: consolas, "Courier New", courier, monospace; BACKGROUND-COLOR: #ffffff
}
.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 {
	MARGIN: 0em; WIDTH: 100%; BACKGROUND-COLOR: #f4f4f4
}
.csharpcode .lnum {
	COLOR: #606060
}
&lt;/STYLE&gt;

&lt;P&gt;Infact, the secrect behind orderby in terms of in-memory sort is nothing but IComparer :-). &lt;/P&gt;
&lt;P&gt;Finally, I found users sending me requests of new stuffs to be implemented in the toolkit, its really nice to hear feedback (both good and bad), keep those coming. In this way, I will be able to make it more useful in coming days. &lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;Project url : &lt;A class="" title=http://www.codeplex.com/linqextender href="http://www.codeplex.com/linqextender" target=_blank mce_href="http://www.codeplex.com/linqextender"&gt;www.codeplex.com/linqextender&lt;/A&gt; &lt;/P&gt;&lt;A href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f03%2f22%2flinqextender-1-3-1.aspx"&gt;&lt;IMG border=0 alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f03%2f22%2flinqextender-1-3-1.aspx"&gt;&lt;/A&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6009810" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=U44VBI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=U44VBI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=BjvV9I"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=BjvV9I" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=MTnnvI"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=MTnnvI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/burncsharp?a=ghTeTi"&gt;&lt;img src="http://feeds.feedburner.com/~f/burncsharp?i=ghTeTi" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/burncsharp/~4/255952937" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/LinqExtender/default.aspx">LinqExtender</category><feedburner:origLink>http://weblogs.asp.net/mehfuzh/archive/2008/03/22/linqextender-1-3-1.aspx</feedburner:origLink></item><item><title>OpenXML to parse your office documents</title><link>http://feeds.feedburner.com/~r/burncsharp/~3/251652332/openxml-to-parse-your-office-documents.aspx</link><pubDate>Fri, 14 Mar 2008 21:32:09 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:5969804</guid><dc:creator>mehfuzh</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://weblogs.asp.net/mehfuzh/rsscomments.aspx?PostID=5969804</wfw:commentRss><comments>http://weblogs.asp.net/mehfuzh/archive/2008/03/15/openxml-to-parse-your-office-documents.aspx#comments</comments><description>&lt;p&gt;ECMA OpenXml is a recognized&amp;nbsp; open standard for saving and retrieving&amp;nbsp; office documents that enables cross-platform document porting and sharing. The Office 2007 uses this format for its data persistence for word, excel and power point lineups. There is a OpenXml SDK CTP available for it to download from MSDN, which lets you create your own office component that works on universal format.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Now, using OpenXml SDK creating office components is easier than before, also it promises to bring you cross product and platform flavor.&lt;/p&gt; &lt;p&gt;OpenXml document generally looks like&lt;/p&gt;&lt;pre class="csharpcode"&gt;&amp;lt;w:document
 w:xmlns=&lt;span class="str"&gt;"http://schemas.openxmlformats.org/wordprocessingml/2006/main"&lt;/span&gt;&amp;gt;
  &amp;lt;w:body&amp;gt;
     &amp;lt;w:p&amp;gt;
        &lt;span class="rem"&gt;// items goes here&lt;/span&gt;
     &amp;lt;/w:p&amp;gt;
  &amp;lt;/w:body&amp;gt;
&amp;lt;/w:document&amp;gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;.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; }
&lt;/style&gt;

&lt;style type="text/css"&gt;.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 { colo