<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.devmavens.com/~d/styles/itemcontent.css"?><rss version="2.0">
<channel>
    <title>DevMavens Feed</title>
    <link>http://DevMavens.com/</link>
    <description>DevMavens</description>
    <language>en-us</language>
    <docs>http://DevMavens.com/Rss</docs>
 
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.devmavens.com/Devmavens" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="devmavens" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
      <title>PAVE the Way to Effective Calls to Action</title>
      <author>Steve Smith</author>
      <link>http://stevesmithblog.com/blog/pave-the-way-to-effective-calls-to-action/</link>
      <description>&lt;p&gt;&lt;a href="http://www.flickr.com/photos/myconstructionphotos/1525875787/" rel="nofollow"&gt;&lt;img style="border-right-width: 0px; margin: 0px 0px 0px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="paving" border="0" alt="paving" align="right" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/PAVEtheWaytoEffectiveCallstoAction_15003/paving_3.jpg" width="240" height="182" /&gt;&lt;/a&gt; In their book, &lt;a href="http://www.amazon.com/gp/product/0470499311?ie=UTF8&amp;amp;tag=aspalliancecom&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0470499311" rel="nofollow"&gt;Inbound Marketing&lt;/a&gt; (&lt;a href="http://stevesmithblog.com/blog/inbound-marketing-and-small-business-trends/"&gt;review&lt;/a&gt;), authors &lt;a href="http://www.hubspot.com/company/management/" rel="nofollow"&gt;Shah and Halligan&lt;/a&gt; describe some key traits of effective calls to action.&amp;#160; The four important qualities of killer calls-to-action are that they be Valuable, Easy-to-Use, Prominent, and Action-Oriented (chapter 8).&amp;#160; The authors go on to suggest that this be referred to as “VEPA”, but I think we can do better than that.&amp;#160; By simply shifting the letters by 2 positions, this becomes the much more memorable mnemonic, PAVE:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;P&lt;/strong&gt;rominent.&amp;#160; Your offer must stand out.&amp;#160; It should be difficult to miss.&amp;#160; Don’t make potential customers have to think about how to interact with you.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;ction-Oriented.&amp;#160; You want the visitor to DO something.&amp;#160; The call to action should compel the user to take action (hence the name) using a verb.&amp;#160; A great analysis of the difference wording can make can be found here.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;V&lt;/strong&gt;aluable.&amp;#160; Make sure it’s clear to the visitor what’s in it for them if they take action.&amp;#160; Internet users have (justifiably) grown skeptical of wasting their time with offers online.&amp;#160; Make sure your offer if valuable but also instills trust and helps you build a relationship with the user.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;E&lt;/strong&gt;asy-to-Use. Make it as simple as possible for the user to respond to your call to action.&amp;#160; Think Amazon One-Click purchasing.&amp;#160; Again, don’t make the user think about how to proceed, and don’t put any unnecessary barriers (like longer-than-necessary registration forms) in front of them.&lt;/p&gt;  &lt;p&gt;So there you have it – four qualities of calls to action that will help &lt;strong&gt;PAVE&lt;/strong&gt; the way to higher response rates for your web site.&amp;#160; Perhaps when it comes time for a second edition of Inbound Marketing, they’ll use the PAVE acronym (and maybe even credit me).&lt;/p&gt;  &lt;div about="http://www.flickr.com/photos/myconstructionphotos/1525875787/" xmlns:cc="http://creativecommons.org/ns#"&gt;&lt;a href="http://www.flickr.com/photos/myconstructionphotos/" rel="cc:attributionURL"&gt;&lt;font size="1"&gt;http://www.flickr.com/photos/myconstructionphotos/&lt;/font&gt;&lt;/a&gt;&lt;font size="1"&gt; / &lt;/font&gt;&lt;a href="http://creativecommons.org/licenses/by-nc-nd/2.0/" rel="license"&gt;&lt;font size="1"&gt;CC BY-NC-ND 2.0&lt;/font&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tzmoF6RmVK4sMw7MYye4chy9eF8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tzmoF6RmVK4sMw7MYye4chy9eF8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tzmoF6RmVK4sMw7MYye4chy9eF8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tzmoF6RmVK4sMw7MYye4chy9eF8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=RV7kCvhjnV8:rNh1vrQ-tPg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=RV7kCvhjnV8:rNh1vrQ-tPg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=RV7kCvhjnV8:rNh1vrQ-tPg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=RV7kCvhjnV8:rNh1vrQ-tPg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=RV7kCvhjnV8:rNh1vrQ-tPg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=RV7kCvhjnV8:rNh1vrQ-tPg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StevenSmith/~4/RV7kCvhjnV8" height="1" width="1"/&gt; &lt;hr /&gt;Read more: &lt;a href="http://stevesmithblog.com/blog/pave-the-way-to-effective-calls-to-action/"&gt;PAVE the Way to Effective Calls to Action&lt;/a&gt; | &lt;a href="http://feeds.stevesmithblog.com/StevenSmith"&gt;Subscribe&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YDqSzvG6nRrZ_XI_vVWdIrWlwzI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YDqSzvG6nRrZ_XI_vVWdIrWlwzI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YDqSzvG6nRrZ_XI_vVWdIrWlwzI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YDqSzvG6nRrZ_XI_vVWdIrWlwzI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Mon, 08 Feb 2010 21:53:00 GMT</pubDate>
      <guid>http://stevesmithblog.com/blog/pave-the-way-to-effective-calls-to-action/</guid>
    </item>
 
    <item>
      <title>Upcoming Events</title>
      <author>Scott Allen</author>
      <link>http://odetocode.com/Blogs/scott/archive/2010/02/08/upcoming-events.aspx</link>
      <description>&lt;p&gt;Here are some events I’ll be speaking at over the next couple months:&lt;/p&gt;  &lt;h3&gt;&lt;a href="http://www.devteach.com/Index.aspx" target="_blank"&gt;DevTeach&lt;/a&gt; &lt;/h3&gt;  &lt;p&gt;&lt;strong&gt;Toronto / Mississauga March 8-12&lt;/strong&gt;. DevTeach stands for Developers Teaching. It’s a conference done by developers for developers. This annual event offers the elements of an international conference and the elements of a community event. Sessions include both presentation material and, whenever possible, hands-on training. We like to describe this event as the Developers Festival. Find out who should attend at &lt;a href="http://www.devteach.com/WhoShouldAttend.aspx#Who"&gt;this link&lt;/a&gt;. Check out the &lt;a href="http://www.devteach.com/WhoShouldAttend.aspx"&gt;top ten ways&lt;/a&gt; to convince your boss to let you go this event. DevTeach is about becoming one of the best developer by getting training from the &lt;a href="http://www.devteach.com/Speaker.aspx"&gt;best in the industry&lt;/a&gt;.&lt;/p&gt;  &lt;h3&gt;&lt;a href="http://www.scandevconf.se/2010/conference/" target="_blank"&gt;Scandinavian Developer Conference&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;&lt;strong&gt;Göteborg, Sweden March 16-17&lt;/strong&gt;. Whether you are someone learning development in Java, .NET or IBM i or you are an experienced user of these technologies for 10 years or more, there are lot of great information to be shared with everyone.&lt;/p&gt;  &lt;p&gt;In addition to technical sessions, we will also have tracks with presentations about the Development Process and Methodology: Agile Methodology, Test Driven Development, System Engineering, Architecture, Project Management, Best practices, "Agile in the Organization". We will also have tracks about hot topics like Cloud Computing, Testing, Web Development and Mobile Solutions. At the Conference there will also be a track of Emerging Technologies presented in cooperation with ThoughtWorks ( &lt;a href="http://www.thoughtworks.com/"&gt;www.thoughtworks.com&lt;/a&gt; )&lt;/p&gt;  &lt;h3&gt;&lt;a href="http://www.devdays.nl/Default.aspx?pid=68&amp;amp;lang=en" target="_blank"&gt;DevDays 2010&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;&lt;strong&gt;DevDays is being held at World Forum in Den Haag March 30-31.&lt;/strong&gt; DevDays 2010: the biggest Microsoft event in the Netherlands for software development and software architecture. Every year, thousands of professionals visit DevDays to get completely up-to-date with all recent developments in their area of expertise in two days.&lt;/p&gt;  &lt;h3&gt;&lt;a href="http://www.devconnections.com/" target="_blank"&gt;DevConnections&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;&lt;strong&gt;Las Vegas April 12-14 2010. &lt;/strong&gt;Developers from around the world will gather at the world famous Bellagio, for the Microsoft Visual Studio Conference &amp;amp; Expo, ASP.NET &amp;amp; Silverlight Conference &amp;amp; Expo and SQL Server Conference &amp;amp; Expo. You can be a part of this exciting event while you enjoy one of the most stunning hotels on the Las Vegas Strip at a great conference rate!&lt;/p&gt;&lt;img src="http://odetocode.com/Blogs/scott/aggbug/1047.aspx" width="1" height="1" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OdeToCode?a=1JaVYgjkngg:VxqtCJdzgS8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OdeToCode?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OdeToCode?a=1JaVYgjkngg:VxqtCJdzgS8:jWeZv7XsJd0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OdeToCode?d=jWeZv7XsJd0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OdeToCode?a=1JaVYgjkngg:VxqtCJdzgS8:zYSYRoQSaQY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OdeToCode?d=zYSYRoQSaQY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OdeToCode?a=1JaVYgjkngg:VxqtCJdzgS8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OdeToCode?i=1JaVYgjkngg:VxqtCJdzgS8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/OdeToCode?a=1JaVYgjkngg:VxqtCJdzgS8:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OdeToCode?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt; &lt;hr /&gt;Read more: &lt;a href="http://odetocode.com/Blogs/scott/archive/2010/02/08/upcoming-events.aspx"&gt;Upcoming Events&lt;/a&gt; | &lt;a href="http://feeds.feedburner.com/OdeToCode"&gt;Subscribe&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dN_jwScRMina58a14LTKl6Qnys8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dN_jwScRMina58a14LTKl6Qnys8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dN_jwScRMina58a14LTKl6Qnys8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dN_jwScRMina58a14LTKl6Qnys8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Mon, 08 Feb 2010 19:12:00 GMT</pubDate>
      <guid>http://odetocode.com/Blogs/scott/archive/2010/02/08/upcoming-events.aspx</guid>
    </item>
 
    <item>
      <title>Say hello to Uber Prof</title>
      <author>Oren Eini</author>
      <link>http://feedproxy.google.com/~r/AyendeRahien/~3/ow2Bmq8csqU/say-hello-to-uber-prof.aspx</link>
      <description>&lt;p&gt;I got several requests for this, so I am making &lt;a href="http://hibernatingrhinos.com/products/UberProf"&gt;Uber Prof&lt;/a&gt; itself available for purchasing.&lt;/p&gt;  &lt;p&gt;What is Uber Prof? &lt;/p&gt;  &lt;p&gt;It is a short hand way of saying: All the OR/M profilers that we make.&lt;/p&gt;  &lt;p&gt;An Uber Prof license gives you the ability to use:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://nhprof.com/"&gt;NHibernate Profiler&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://hibernateprofiler.com/"&gt;Hibernate Profiler&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://l2sprof.com"&gt;Linq to SQL Profiler&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://efprof.com"&gt;Entity Framework Profiler&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;And it will automatically give you the ability to use any additional profilers that we will create. And yes, there is an upgrade path if you already purchased a single profiler license and would like to upgrade to Uber Prof.&lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/11307.aspx" width="1" height="1" /&gt;&lt;p&gt;&lt;a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/AYENDE/7F0925A0A62297DE7146DBA81BFA4B07CC279293"&gt;&lt;img src="http://theloungenet.com/feeds/img/DOTNETRSS/AYENDE/7F0925A0A62297DE7146DBA81BFA4B07CC279293"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AyendeRahien/~4/ow2Bmq8csqU" height="1" width="1"/&gt; &lt;hr /&gt;Read more: &lt;a href="http://feedproxy.google.com/~r/AyendeRahien/~3/ow2Bmq8csqU/say-hello-to-uber-prof.aspx"&gt;Say hello to Uber Prof&lt;/a&gt; | &lt;a href="http://feeds.feedburner.com/AyendeRahien"&gt;Subscribe&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FzUwCFNSHFaPr_Sw4gaPvrMjT04/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FzUwCFNSHFaPr_Sw4gaPvrMjT04/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FzUwCFNSHFaPr_Sw4gaPvrMjT04/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FzUwCFNSHFaPr_Sw4gaPvrMjT04/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Mon, 08 Feb 2010 15:00:00 GMT</pubDate>
      <guid>http://feedproxy.google.com/~r/AyendeRahien/~3/ow2Bmq8csqU/say-hello-to-uber-prof.aspx</guid>
    </item>
 
    <item>
      <title>Built-in Charting Controls (VS 2010 and .NET 4 Series)</title>
      <author>Scott Guthrie</author>
      <link>http://weblogs.asp.net/scottgu/archive/2010/02/07/built-in-charting-controls-vs-2010-and-net-4-series.aspx</link>
      <description>&lt;font size="2" face="arial"&gt;   &lt;p&gt;[&lt;em&gt;In addition to blogging, I am also now using Twitter for quick updates and to share links. Follow me at: &lt;/em&gt;&lt;a href="http://www.twitter.com/scottgu" target="_blank"&gt;twitter.com/scottgu&lt;/a&gt;]&lt;/p&gt;    &lt;p&gt;This is the fifteenth in &lt;a href="http://weblogs.asp.net/scottgu/archive/2009/08/25/vs-2010-and-net-4-series.aspx" target="_blank"&gt;a series of blog posts&lt;/a&gt; I’m doing on the upcoming VS 2010 and .NET 4 release.&amp;#160; Today’s post covers a nice addition to ASP.NET and Windows Forms with .NET 4 - built-in charting control support.&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;ASP.NET and Windows Forms Charting Controls&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;A little over 14 months ago &lt;a href="http://weblogs.asp.net/scottgu/archive/2008/11/24/new-asp-net-charting-control-lt-asp-chart-runat-quot-server-quot-gt.aspx" target="_blank"&gt;I blogged&lt;/a&gt; about how Microsoft was making available &lt;a href="http://weblogs.asp.net/scottgu/archive/2008/11/24/new-asp-net-charting-control-lt-asp-chart-runat-quot-server-quot-gt.aspx" target="_blank"&gt;a free download of charting controls&lt;/a&gt; for both ASP.NET 3.5 and Windows Forms 3.5.&amp;#160; &lt;/p&gt;    &lt;p&gt;You can &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=130f7986-bf49-4fe5-9ca8-910ae6ea442c&amp;amp;DisplayLang=en" target="_blank"&gt;download&lt;/a&gt; and use these runtime controls for free within your web and client applications today.&amp;#160; You can also &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=1D69CE13-E1E5-4315-825C-F14D33A303E9&amp;amp;displaylang=en" target="_blank"&gt;download VS 2008 tooling support&lt;/a&gt; for them.&amp;#160; They provide a rich set of charting capabilities that is easy to use.&amp;#160; To get a sense of what all you can do with them, I recommend &lt;a href="http://code.msdn.microsoft.com/mschart/Release/ProjectReleases.aspx?ReleaseId=1591" target="_blank"&gt;downloading the ASP.NET and Windows Forms sample projects&lt;/a&gt; which provide more than 200 samples within them.&amp;#160; Below is a screen-shot of some pie and doughnut chart samples from the ASP.NET sample application:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_14A80EFD.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_3F33CA0D.png" width="771" height="483" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Charting Controls Now Built-into .NET 4&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;With .NET 3.5 you had to separately download the chart controls and add them into your application.&amp;#160; With .NET 4 these controls are now built-into ASP.NET 4 and Windows Forms 4 – which means you can immediately take advantage of them out of the box (no separate download or registration required).&amp;#160; &lt;/p&gt;    &lt;p&gt;Within ASP.NET 4 applications you’ll find that there is now a new &amp;lt;asp:chart&amp;gt; control within the “Data” tab of the Toolbox:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_7D4CE4BE.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_7555425C.png" width="209" height="576" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;You can use this control without having to register or wire-up any configuration file entries.&amp;#160; All of the charting control configuration is now pre-registered with ASP.NET 4 (meaning nothing has to be added to an application’s web.config file for them to work).&amp;#160; This enables you to maintain &lt;a href="http://weblogs.asp.net/scottgu/archive/2009/08/25/clean-web-config-files-vs-2010-and-net-4-0-series.aspx" target="_blank"&gt;very clean and minimal Web.config files&lt;/a&gt;.&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Learning more about the &amp;lt;asp:chart&amp;gt; control&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;Scott Mitchell has written a great series of articles on the &lt;a href="http://www.4guysfromrolla.com"&gt;www.4guysfromrolla.com&lt;/a&gt; site on how to take advantage of the &amp;lt;asp:chart&amp;gt; control: &lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;&lt;a href="http://www.4guysfromrolla.com/articles/072209-1.aspx"&gt;Getting Started&lt;/a&gt; - walks through getting started using the Chart Controls, from version requirements to downloading and installing the Chart Controls, to displaying a simple chart in an ASP.NET page. &lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.4guysfromrolla.com/articles/072909-1.aspx"&gt;Plotting Chart Data&lt;/a&gt; - examines the multitude of ways by which data can be plotted on a chart, from databinding to manually adding the points one at a time. &lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.4guysfromrolla.com/articles/081909-1.aspx"&gt;Rendering the Chart&lt;/a&gt; - the Chart Controls offer a variety of ways to render the chart data into an image. This article explores these options. &lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.4guysfromrolla.com/articles/092309-1.aspx"&gt;Sorting and Filtering Chart Data&lt;/a&gt; - this article shows how to programmatically sort and filter the chart's data prior to display. &lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.4guysfromrolla.com/articles/093009-1.aspx"&gt;Programmatically Generating Chart Images&lt;/a&gt; - learn how to programmatically create and alter the chart image file. &lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.4guysfromrolla.com/articles/102809-1.aspx"&gt;Creating Drill Down Reports&lt;/a&gt; - see how to build drill down reports using the Chart control. &lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.4guysfromrolla.com/articles/111809-1.aspx"&gt;Adding Statistical Formulas&lt;/a&gt; - learn how to add statistical formulas, such as mean, median, variance, and forecasts, to your charts. &lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.4guysfromrolla.com/articles/121609-1.aspx"&gt;Enhancing Charts With Ajax&lt;/a&gt; - improve the user experience for dynamic and interactive charts using Ajax. &lt;/li&gt;   &lt;/ol&gt;    &lt;p&gt;His articles are written using .NET 3.5 and the separate ASP.NET charting controls download – but all of the concepts and syntax work out of the box exactly the same with ASP.NET 4.&lt;/p&gt;    &lt;p&gt;Michael Ceranski has also written a blog post demonstrating &lt;a href="http://www.codecapers.com/post/Build-a-Dashboard-With-Microsoft-Chart-Controls.aspx" target="_blank"&gt;how to use the ASP.NET Chart control within an ASP.NET MVC application&lt;/a&gt;.&amp;#160; I’m hoping someone will create some nice ASP.NET MVC Html.Chart() helper methods soon that will make this even easier to do in the future.&lt;/p&gt;    &lt;p&gt;Hope this helps,&lt;/p&gt;    &lt;p&gt;Scott&lt;/p&gt; &lt;/font&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7338516" width="1" height="1"&gt; &lt;hr /&gt;Read more: &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/02/07/built-in-charting-controls-vs-2010-and-net-4-series.aspx"&gt;Built-in Charting Controls (VS 2010 and .NET 4 Series)&lt;/a&gt; | &lt;a href="http://weblogs.asp.net/scottgu/rss.aspx"&gt;Subscribe&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/rF1f3EueGbZoOUWXSBCVpqxkBhg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rF1f3EueGbZoOUWXSBCVpqxkBhg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/rF1f3EueGbZoOUWXSBCVpqxkBhg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rF1f3EueGbZoOUWXSBCVpqxkBhg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Mon, 08 Feb 2010 10:54:52 GMT</pubDate>
      <guid>http://weblogs.asp.net/scottgu/archive/2010/02/07/built-in-charting-controls-vs-2010-and-net-4-series.aspx</guid>
    </item>
 
    <item>
      <title>Windows 7 brings new life to devices that don’t have Vista drivers</title>
      <author>Jeffrey Palermo</author>
      <link>http://feeds.jeffreypalermo.com/~r/jeffreypalermo/~3/cPNLtU1iK74/</link>
      <description>&lt;p&gt;&lt;a href="http://www.amazon.com/gp/product/B0007W2E64?ie=UTF8&amp;amp;tag=jeffreypalerm-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=B0007W2E64"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" border="0" alt="MiniVox USB Speakerphone" align="right" src="http://ecx.images-amazon.com/images/I/312oRaaJMYL._SL500_AA280_.jpg" width="101" height="101" /&gt;&lt;/a&gt;Back in 2005, I purchased an &lt;a href="http://www.amazon.com/gp/product/B0007W2E64?ie=UTF8&amp;amp;tag=jeffreypalerm-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=B0007W2E64"&gt;mVox 100&lt;/a&gt; (mv100).&amp;#160; This device worked great on Windows XP, and I used it in various VOIP application.&amp;#160; Really great USB speakerphone.&amp;#160; It’s tiny, also, and I kept it tucked in my back for the last 5 years.&lt;/p&gt;  &lt;p&gt;When I upgraded my computer to Windows Vista, I was rather disappointed that this useful little device no longer worked.&lt;/p&gt;  &lt;p&gt;I could not find any Vista drivers.&amp;#160; From what I gleaned from forums, it relied on usbaudio.sys, which was overhauled in Windows Vista.&amp;#160; Even though I couldn’t use the device, it stayed in my computer bag for 2 years!&amp;#160; I switched computer bags today and uncovered this little speakerphone.&amp;#160; I decided to give it a shot on my Windows 7 computer.&amp;#160; Lo and behold, it worked!&amp;#160; No driver install.&amp;#160; I plugged it in, it detected it, and registered both the built-in microphone and sound card/speaker.&amp;#160; I happened to have Skype open, and Skype immediately registered the device as the microphone and speaker.&amp;#160; Bottom line:&amp;#160; &lt;strong&gt;I am impressed by Windows 7 once again!&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.amazon.com/gp/product/B000HCRVQ2?ie=UTF8&amp;amp;tag=jeffreypalerm-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=B000HCRVQ2"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" align="left" src="http://jeffreypalermo.com/files/media/image/WindowsLiveWriter/Windows7bringsnewlifetodevicesthatdontha_12018/image_3.png" width="103" height="59" /&gt;&lt;/a&gt; My mobile telephony kit now contains this &lt;a href="http://www.amazon.com/gp/product/B0007W2E64?ie=UTF8&amp;amp;tag=jeffreypalerm-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=B0007W2E64"&gt;mVox 100 USB speakerphone&lt;/a&gt; as well as my trusty &lt;a href="http://www.amazon.com/gp/product/B000HCRVQ2?ie=UTF8&amp;amp;tag=jeffreypalerm-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=B000HCRVQ2"&gt;Logitech notebook headset&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.jeffreypalermo.com/~ff/jeffreypalermo?a=cPNLtU1iK74:xY4ut0ti7Yo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jeffreypalermo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.jeffreypalermo.com/~ff/jeffreypalermo?a=cPNLtU1iK74:xY4ut0ti7Yo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jeffreypalermo?i=cPNLtU1iK74:xY4ut0ti7Yo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jeffreypalermo/~4/cPNLtU1iK74" height="1" width="1"/&gt; &lt;hr /&gt;Read more: &lt;a href="http://feeds.jeffreypalermo.com/~r/jeffreypalermo/~3/cPNLtU1iK74/"&gt;Windows 7 brings new life to devices that don’t have Vista drivers&lt;/a&gt; | &lt;a href="http://feeds.jeffreypalermo.com/jeffreypalermo"&gt;Subscribe&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3JtIcgDRSq9cp8Bf8-Qvxs6aRBE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3JtIcgDRSq9cp8Bf8-Qvxs6aRBE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3JtIcgDRSq9cp8Bf8-Qvxs6aRBE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3JtIcgDRSq9cp8Bf8-Qvxs6aRBE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Mon, 08 Feb 2010 07:28:14 GMT</pubDate>
      <guid>http://feeds.jeffreypalermo.com/~r/jeffreypalermo/~3/cPNLtU1iK74/</guid>
    </item>
 
    <item>
      <title>A marketing mistake: WCF Data Services &amp;amp; WCF RIA Services</title>
      <author>Oren Eini</author>
      <link>http://feedproxy.google.com/~r/AyendeRahien/~3/vrAKxYTvZQE/a-marketing-mistake-wcf-data-services-amp-wcf-ria-services.aspx</link>
      <description>&lt;p&gt;&lt;a href="http://www.insearchofstupidity.com/illustrations.htm"&gt;&lt;img style="display: inline; margin-left: 0px; margin-right: 0px" alt="Illustration 3" align="right" src="http://www.insearchofstupidity.com/Illustrations/lii3.jpg" /&gt;&lt;/a&gt;There are some things that I just don’t understand, and the decision to name two apparently different technologies working in the same area using those two names is one of them.&lt;/p&gt;  &lt;p&gt;The image on the right is from &lt;a href="http://www.insearchofstupidity.com/"&gt;In Search Of Stupidity&lt;/a&gt;, an excellent and funny book, which talks about a lot of marketing mistakes that software, dedicate a whole chapter for this error.&lt;/p&gt;  &lt;p&gt;Coming back to WCF Data Services &amp;amp; WCF RIA Services, I &lt;a href="http://blogs.msdn.com/endpoint/archive/2010/01/04/wcf-data-services-ria-services-alignment-questions-and-answers.aspx"&gt;read this page&lt;/a&gt;, and I am still confused. It appears that the major difference in that RIA services will generate the Silverlight client classes as part of the build process, where as using Data Services this is a separate process.&lt;/p&gt;  &lt;p&gt;And I am not sure even of that.&lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/11306.aspx" width="1" height="1" /&gt;&lt;p&gt;&lt;a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/AYENDE/E3E3F699F86D1F2DA74E12EF02398E120B56AADB"&gt;&lt;img src="http://theloungenet.com/feeds/img/DOTNETRSS/AYENDE/E3E3F699F86D1F2DA74E12EF02398E120B56AADB"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AyendeRahien/~4/vrAKxYTvZQE" height="1" width="1"/&gt; &lt;hr /&gt;Read more: &lt;a href="http://feedproxy.google.com/~r/AyendeRahien/~3/vrAKxYTvZQE/a-marketing-mistake-wcf-data-services-amp-wcf-ria-services.aspx"&gt;A marketing mistake: WCF Data Services &amp;amp; WCF RIA Services&lt;/a&gt; | &lt;a href="http://feeds.feedburner.com/AyendeRahien"&gt;Subscribe&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HCGVRgZ8uTVNB647R-sm391YZoE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HCGVRgZ8uTVNB647R-sm391YZoE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HCGVRgZ8uTVNB647R-sm391YZoE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HCGVRgZ8uTVNB647R-sm391YZoE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Sun, 07 Feb 2010 15:00:00 GMT</pubDate>
      <guid>http://feedproxy.google.com/~r/AyendeRahien/~3/vrAKxYTvZQE/a-marketing-mistake-wcf-data-services-amp-wcf-ria-services.aspx</guid>
    </item>
 
    <item>
      <title>NoSQL – A Practical Approach, Part 1</title>
      <author>Rob Conery</author>
      <link>http://feedproxy.google.com/~r/wekeroad/EeKc/~3/JFyFSz3nEu0/nosql-a-practical-approach-part-1</link>
      <description>&lt;p&gt;In my last post I took a look at possible approaches to using NoSQL and Reporting, and many people wanted to see what this might look like in practice. In part one, below, I’ll show you ways to work with a NoSQL solution (in this case DB4O) in ways that you will find pretty familiar. I’ll also show you the freedom you can have as a developer when you stop thinking relationally.&lt;/p&gt;   &lt;h2&gt;The Problem&lt;/h2&gt;  &lt;p&gt;We’re building an application with [Favorite ORM] and so far it’s worked out pretty well, but we’ve had to make some compromises that we don’t particularly like and we’re finding that as our application matures we’re having to think way too much about how the data is being handled. Our “maintenance scaling” is not optimal. If you’re not one of these people, then you’re very lucky. I’ve written my own ORM and it still gets in my way, making me very cranky sometimes.&lt;/p&gt;  &lt;h2&gt;Step 1: Shift Your Thinking&lt;/h2&gt;  &lt;p&gt;We work in a pseudo-OO world, straddling a weird purgatory between relational and object-oriented programming. We’ve been lying to ourselves people – we can’t “go full OO” because our ORMs won’t like it. &lt;/p&gt;  &lt;p&gt;ORMs are high-maintenance girl/boyfriends from hell that creep their little co-dependent weirdness deep into your application. Don’t believe me? What namespaces have you had to include in your object model lately? That ISession thing – yah that lives right in your FRICKIN GLOBAL ASAX. &lt;/p&gt;  &lt;p&gt;Buddy, you moved your application into that apartment, got your own drawer, and now you’re having to deal with a high-maintenance partner from hell, who looked all sweet and honey-pottish when you first met but now is demanding foot rubs and chocolate. You get cranky – maybe say some things you didn’t mean and then…&lt;/p&gt;  &lt;p&gt;There your ORM sits, pouting quietly.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;I know what it is. You think I’m fat. That’s the problem – you don’t love me anymore.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;You want to tell the truth: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Yes, well, sweetie 11 dlls – &lt;a href="http://blog.wekeroad.com/subsonic/subsonic-to-acquire-nhibernate/" target="_blank"&gt;800,000 lines of code (and counting) which all weighs in at 4Mb&lt;/a&gt; – all to query a database… yah YOU’RE A PIG&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;… but you don’t. You’re nicer than that and so you sit quietly and console your ORM. “I don’t mind working up another IUserType sweetie – it’s no big thing. This time I’ll be sure to override *all* the methods so you don’t fail completely when a weird value comes out of the database. It’s my fault… as always…”&lt;/p&gt;  &lt;p&gt;There is an alternative and it requires something of you – open your mind and shift into OO. Many of the questions people have about OO/DocumentDBs can be answered by leaning on what you learned from school or books. &lt;/p&gt;  &lt;p&gt;OODBs just serialize and persist your object to disk – keep this in mind, always. The dehydrate/rehydrate them and if you change a type on your object – well the hydrator will do what it can to help out. If you add a property, then all your prop settings for it will be null for all your objects. If you change a property name you’ll have to tell your persistence somehow. &lt;/p&gt;  &lt;p&gt;Lots of questions – so let’s do this. I want to offer as much real code to get your juices flowing so here we go…&lt;/p&gt;  &lt;h2&gt;Step 2: You’ll Need A Helper&lt;/h2&gt;  &lt;p&gt;One thing that many people love about Rails is having so much support from the command line. You can kick up the console and work directly with your model interactively. We don’t have that with .NET and instead rely on our tooling – Visual Studio – which tells us most of what we want to know. &lt;/p&gt;  &lt;p&gt;I like working with a console and I include one in every project. It helps me to work directly with the domain – adding in data from another system, spiking things, whatever. &lt;strong&gt;You’ll need one if you’re going to work with an OODB and I know that right there I’ve probably lost many of you. I know I can’t talk you into it – so go ahead and take off if you like :). I think it’s your loss&lt;/strong&gt;…&lt;/p&gt;  &lt;p&gt;…Because things become a whole lot easier when you get the hell out of the database (where you shouldn’t be anyway). Working in two different systems at once is not only disorienting – it’s also silly. If you need to rename a property and reset it’s data you can do so quickly with a method. I know it’s not as fast as rename column/regen codebase – but honestly it’s incredibly fast.&lt;/p&gt;  &lt;p&gt;But wait. Wait just a damn minute. How often have you *needed* to do this? Yes yes I know that changing property names during development is something that happens – but how often have you had data that you needed to take with it? If you say “all the time” and you’re talking development – you’re doing it wrong.&lt;/p&gt;  &lt;p&gt;If you’re talking about a hot-swap on a live system, well OK. In the 24 years that I’ve been doing this, I’ve changed a column name on a DB precisely twice – and I paid the damn price for it. But I know that people need to do this and I’m happy to say it’s actually *easier* with an object system because you don’t have to worry about blowing up Views or other stored queries.&lt;/p&gt;  &lt;p&gt;To do this change you:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Create your new property, leaving the old one &lt;/li&gt;    &lt;li&gt;Create a console task (or use Albacore) to copy, intelligently, the old property to the new one (perhaps there’s rules? Lookups?) &lt;/li&gt;    &lt;li&gt;Delete your old property and refactor your code &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;I don’t think that it’s that difficult – but I will acknowledge that it’s a downside. I’ll take that downside for the other improvements, however. &lt;/p&gt;  &lt;h2&gt;Step 3: You’ll Need The DLLs&lt;/h2&gt;  &lt;p&gt;For the code you’re about to see I’m going to use DB4O because it’s the most current, mature, and cheapest solution. It’s not free for a commercial project, but it is for developers. If you’re using it in Open Source they have a BSD-friendly license that you can use for distribution if you like.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.db4o.com/DownloadNow.aspx" target="_blank"&gt;You can download it from here&lt;/a&gt;.&lt;/p&gt;  &lt;h2&gt;Step 4: Switching Your Model Over&lt;/h2&gt;  &lt;p&gt;This is probably the simplest thing you can do – believe it or not. You don’t have to add any attributes, no weird base classes. You don’t have to mark your properties as virtual or implement some kind of interface – DB4O will just take your object, serialize it to disk, and let you go on to your business.&lt;/p&gt;  &lt;p&gt;You can (GASP) even remove parameterless constructors. How many ORMs let you do that? &lt;/p&gt;  &lt;p&gt;Bask in that for a second. You can use factories and patterns that help you write less code and you can do it completely without thinking about what your co-dependent database thinks. It’s so freeing that it’s actually a bit scary – just let it roll for a bit – we’ll come back to this.&lt;/p&gt;  &lt;p&gt;Here’s my model – it’s &lt;a href="http://github.com/robconery/Kona/tree/master/Kona.Web/Model/" target="_blank"&gt;the one I’m using with Oren for Kona&lt;/a&gt;, our app we’re building for the NHibernate series on Tekpub. I’ve copied the project on my hard drive and haven’t touched a thing, except to:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Remove the NHibernate namespacing that lives on a number of the model classes &lt;/li&gt;    &lt;li&gt;Remove the mapping files (there were 8 of them) &lt;/li&gt;    &lt;li&gt;Remove the IUserType stuff we added for episode 3 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I left everything else the same.&lt;/p&gt;  &lt;h2&gt;Step 5: Setup Unit of Work&lt;/h2&gt;  &lt;p&gt;I really like the way NHibernate (and Linq to SQL) allow you to use Unit of Work. It’s a very natural way of persisting the data – so let’s set that up. First I’ll setup the interface:&lt;/p&gt;  &lt;p&gt;&lt;script src="http://gist.github.com/296275.js?file=ISession.cs"&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;Next I want to setup the connection to DB4O. Normally this is done by opening up a file but that won’t work on the web (it’ll work just fine for desktop apps) so I want to make sure to use the client/server model here which DB4O implements nicely:&lt;/p&gt;  &lt;p&gt;&lt;script src="http://gist.github.com/296275.js?file=SessionFactory.cs"&gt;&lt;/script&gt;  &lt;/p&gt;  &lt;p&gt;Notice that I’m putting the data file into App_Data – this is because it’s a protected directory by ASP.NET and also allows me to terse up the connection string so I don’t need to put in a file reference.&lt;/p&gt;  &lt;p&gt;The thing to note here is you want to be sure the server stays a singleton – which you can work with your favorite IoC if you like (it implements IObjectServer). There’s probably a better pattern here – happy to take recommendations.&lt;/p&gt;  &lt;p&gt;Finally – let’s create our Unit of Work, which will implement our interface above:&lt;/p&gt;  &lt;p&gt;&lt;script src="http://gist.github.com/296275.js?file=DB4O.cs"&gt;&lt;/script&gt;  &lt;/p&gt;   &lt;h2&gt;Step 6: Taking it For a Spin&lt;/h2&gt;  &lt;p&gt;There’s more we’re going to do here – but for those of you feeling antsy, crank up a test project and add an App.config with a hard file reference for your “ObjectStore” connection string (you can’t use HttpContext in a test project unless you mock it- just hard code a file ref, it’s easier. Call it whatever you want but the extension should be “.yap”).&lt;/p&gt;  &lt;p&gt;Here’s some code that will work, assuming you have a Category and Product object:&lt;/p&gt;     &lt;pre class="csharpcode"&gt;        
        [Fact]
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; DB_Should_Save_Multiple_Nested_Objects() {

            &lt;span class="kwrd"&gt;using&lt;/span&gt; (var s = SessionFactory.Current) {
                
                s.DeleteAll&amp;lt;Category&amp;gt;();
                s.DeleteAll&amp;lt;Product&amp;gt;();

                var c = &lt;span class="kwrd"&gt;new&lt;/span&gt; Category(&lt;span class="str"&gt;&amp;quot;test1&amp;quot;&lt;/span&gt;);
                var c2 = &lt;span class="kwrd"&gt;new&lt;/span&gt; Category(&lt;span class="str"&gt;&amp;quot;test2&amp;quot;&lt;/span&gt;);

                var p = &lt;span class="kwrd"&gt;new&lt;/span&gt; Product();
                p.SKU = &lt;span class="str"&gt;&amp;quot;1234&amp;quot;&lt;/span&gt;;
                p.Name = &lt;span class="str"&gt;&amp;quot;Jurge&amp;quot;&lt;/span&gt;;

                p.Categories.Add(c);
                p.Categories.Add(c2);

                s.Save(p);
                s.CommitChanges();

                var cat = s.Single&amp;lt;Category&amp;gt;(x =&amp;gt; x.Name == &lt;span class="str"&gt;&amp;quot;test2&amp;quot;&lt;/span&gt;);
                Assert.NotNull(cat);

                Assert.Equal(2, s.All&amp;lt;Category&amp;gt;().Count());
                Assert.Equal(1, s.All&amp;lt;Product&amp;gt;().Count());
            }
        }&lt;/pre&gt;

&lt;p&gt;Something to notice here – when I save the Product object (with a child IEnumerable&amp;lt;Category&amp;gt;) &lt;strong&gt;the objects are pealed apart and joined by pointers.&lt;/strong&gt; Take that in for a moment: DB4O knows that these are complex objects and will separate them for you so you can query them individually (as opposed to a document db, which just embeds the objects).&lt;/p&gt;

&lt;p&gt;Something else to notice is that to store these things you need to call “CommitChanges()”, which commits the files to disk. If you don’t do this the objects will still be “stored” – but only in RAM. This makes DB4O an ideal testing mechanism – you don’t have to mock out your repository (if you don’t want to) and you’re also working directly with the storage medium so you’ll know if there are any weirdnesses.&lt;/p&gt;

&lt;p&gt;One question that comes up is:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;How does DB4O know to add a new object, or update an old one?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is a great question because the answer is so simple that, many times it’s a cold splash of water to shake you out of your Relational Malaise. &lt;strong&gt;The answer is “Equals() and GetHashCode()”&lt;/strong&gt; – DB4O just checks an internal index to see if there is an existing hash for the object you pass in – reset GetHashCode to return the hash of your identifier and you’re all set.&lt;/p&gt;

&lt;p&gt;In my case I overrode all of that (like you should anyway in an OO world) and set my Product.Equals()/GetHashCode() to evaluate the SKU. &lt;/p&gt;

&lt;p&gt;Finally – for those wondering about transactions – that’s exactly what CommitChanges() does (which calls the DB4O Commit() method). You can Rollback() after Save() if you like – it’s all very intuitive and there’s a lot more info on their website including a 200 page PDF will all kinds of great examples.&lt;/p&gt;

&lt;h2&gt;Step 7: Making it Pretty&lt;/h2&gt;

&lt;p&gt;This all seems pretty good – but it would be fun to get past the method noise with all the generic typing – like Linq to SQL and SubSonic do with built-in properties for objects.&lt;/p&gt;

&lt;p&gt;Great! Let’s do it:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; KonaSession:Db4oSession {
        &lt;span class="kwrd"&gt;internal&lt;/span&gt; KonaSession(IObjectServer server) : &lt;span class="kwrd"&gt;base&lt;/span&gt;(server) { }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; IQueryable&amp;lt;Product&amp;gt; Products {
            get {
                &lt;span class="kwrd"&gt;return&lt;/span&gt; All&amp;lt;Product&amp;gt;();
            }
        }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; IQueryable&amp;lt;Order&amp;gt; Orders {
            get {
                &lt;span class="kwrd"&gt;return&lt;/span&gt; All&amp;lt;Order&amp;gt;();
            }
        }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; IQueryable&amp;lt;Customer&amp;gt; Customers {
            get {
                &lt;span class="kwrd"&gt;return&lt;/span&gt; All&amp;lt;Customer&amp;gt;();
            }
        }
    }&lt;/pre&gt;

&lt;p&gt;To make this work I had to reset the SessionFactory to return KonaSession instead of Db4oSession (2 lines of code – once again focusing on OO means here, not relational weirdness):&lt;/p&gt;

&lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; SessionFactory {
        &lt;span class="kwrd"&gt;static&lt;/span&gt; ISession _current;
        &lt;span class="rem"&gt;//this needs to stay static - can't have more than &lt;/span&gt;
        &lt;span class="rem"&gt;//one server on the file&lt;/span&gt;
        &lt;span class="kwrd"&gt;static&lt;/span&gt; IObjectServer _server;

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; ISession CreateSession() {

            &lt;span class="kwrd"&gt;if&lt;/span&gt; (_server == &lt;span class="kwrd"&gt;null&lt;/span&gt;) {
                &lt;span class="kwrd"&gt;string&lt;/span&gt; _dbPath = System.Configuration.ConfigurationManager
                    .ConnectionStrings[&lt;span class="str"&gt;&amp;quot;ObjectStore&amp;quot;&lt;/span&gt;].ConnectionString;

                &lt;span class="rem"&gt;//check to see if this is pointing to data directory&lt;/span&gt;
                &lt;span class="rem"&gt;//change as you need btw&lt;/span&gt;
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (_dbPath.Contains(&lt;span class="str"&gt;&amp;quot;|DataDirectory|&amp;quot;&lt;/span&gt;)) {

                    &lt;span class="rem"&gt;//we know, then, that this is a web project&lt;/span&gt;
                    &lt;span class="rem"&gt;//and HttpContext is hopefully not null...&lt;/span&gt;

                    _dbPath = _dbPath.Replace(&lt;span class="str"&gt;&amp;quot;|DataDirectory|&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;);
                    &lt;span class="kwrd"&gt;string&lt;/span&gt; appDir = HttpContext.Current.Server.MapPath(&lt;span class="str"&gt;&amp;quot;~/App_Data/&amp;quot;&lt;/span&gt;);
                    _dbPath = Path.Combine(appDir, _dbPath);
                }
                _server = Db4oFactory.OpenServer(_dbPath, 0);
            }

            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; KonaSession(_server);
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; KonaSession Current {
            get {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (_current == &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                    _current = CreateSession();
                &lt;span class="kwrd"&gt;return&lt;/span&gt; (KonaSession)_current;
            }
        }
    }&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;&amp;#160;&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;Now you can query happily in the way you’ve been used to:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;        [Fact]
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; I_Dont_Want_To_Have_My_Cheese_Moved_Too_Far_Away() {
            &lt;span class="kwrd"&gt;using&lt;/span&gt; (var db = SessionFactory.Current) {
                var prods = db.Products;
                Assert.Equal(1, prods.Count());
              
            }
        }&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h2&gt;Summary&lt;/h2&gt;

&lt;p&gt;All of a sudden you begin to feel a ton of freedom that’s afforded by staying close to OO principles. In this case I can go further and seal up the DB4O-specific stuff – which will force people to only query through the KonaSession class above. This is nice because, ho ho ho, these are your AggregateRoots and you really only want people to access/work with the child object (such as Category) through the parent objects – just like DDD says you should.&lt;/p&gt;

&lt;p&gt;In Part 2 I’ll do a deeper dive on ways to approach reporting.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=JFyFSz3nEu0:1CPC5ymgUHY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=JFyFSz3nEu0:1CPC5ymgUHY:Q8R26LmAkSY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?i=JFyFSz3nEu0:1CPC5ymgUHY:Q8R26LmAkSY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/wekeroad/EeKc?a=JFyFSz3nEu0:1CPC5ymgUHY:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/wekeroad/EeKc?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/wekeroad/EeKc/~4/JFyFSz3nEu0" height="1" width="1"/&gt; &lt;hr /&gt;Read more: &lt;a href="http://feedproxy.google.com/~r/wekeroad/EeKc/~3/JFyFSz3nEu0/nosql-a-practical-approach-part-1"&gt;NoSQL – A Practical Approach, Part 1&lt;/a&gt; | &lt;a href="http://feeds.feedburner.com/wekeroad/EeKc"&gt;Subscribe&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/InFlBMTu_7n3ogUDkzPoE4_GpbE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/InFlBMTu_7n3ogUDkzPoE4_GpbE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/InFlBMTu_7n3ogUDkzPoE4_GpbE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/InFlBMTu_7n3ogUDkzPoE4_GpbE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Sun, 07 Feb 2010 04:05:14 GMT</pubDate>
      <guid>http://feedproxy.google.com/~r/wekeroad/EeKc/~3/JFyFSz3nEu0/nosql-a-practical-approach-part-1</guid>
    </item>
 
    <item>
      <title>Traditional architecture makes me flinch</title>
      <author>Oren Eini</author>
      <link>http://feedproxy.google.com/~r/AyendeRahien/~3/ZEw4yKCBPqk/traditional-architecture-makes-me-flinch.aspx</link>
      <description>&lt;p&gt;I just finished drawing the following:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/Traditionalarchitecturemakesmeflinch_23A7/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/Traditionalarchitecturemakesmeflinch_23A7/image_thumb.png" width="626" height="144" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;It makes me feel dirty inside, to do so. Mostly because I really don’t like or believe in building applications in this manner anymore. I would really like to be able to do this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/Traditionalarchitecturemakesmeflinch_23A7/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/Traditionalarchitecturemakesmeflinch_23A7/image_thumb_1.png" width="525" height="573" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Unfortunately, I am talking about another subject in the context where I am showing the first architectural diagram, and I need to present only a single new concept at a time.&lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/11305.aspx" width="1" height="1" /&gt;&lt;p&gt;&lt;a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/AYENDE/19B4E223043B25A1853B0E2D3CB7F44CC982564E"&gt;&lt;img src="http://theloungenet.com/feeds/img/DOTNETRSS/AYENDE/19B4E223043B25A1853B0E2D3CB7F44CC982564E"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AyendeRahien/~4/ZEw4yKCBPqk" height="1" width="1"/&gt; &lt;hr /&gt;Read more: &lt;a href="http://feedproxy.google.com/~r/AyendeRahien/~3/ZEw4yKCBPqk/traditional-architecture-makes-me-flinch.aspx"&gt;Traditional architecture makes me flinch&lt;/a&gt; | &lt;a href="http://feeds.feedburner.com/AyendeRahien"&gt;Subscribe&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/GAcH_zpCuIodagM5uPRzClpBWT0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GAcH_zpCuIodagM5uPRzClpBWT0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/GAcH_zpCuIodagM5uPRzClpBWT0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GAcH_zpCuIodagM5uPRzClpBWT0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Sat, 06 Feb 2010 15:00:00 GMT</pubDate>
      <guid>http://feedproxy.google.com/~r/AyendeRahien/~3/ZEw4yKCBPqk/traditional-architecture-makes-me-flinch.aspx</guid>
    </item>
 
    <item>
      <title>Hanselminutes Podcast 199 - How Craigslist Works - with Jeremy Zawodny</title>
      <author>Scott Hanselman</author>
      <link>http://feedproxy.google.com/~r/ScottHanselman/~3/l3J9ESKMLq4/HanselminutesPodcast199HowCraigslistWorksWithJeremyZawodny.aspx</link>
      <description>My one-hundred-and-ninety-ninth podcast is up. I chat with Jeremy Zawodny, a developer at Craigslist on how the system is put together. How many servers do they have? How does it all fit together and what are the major technology problems they have &lt;hr /&gt;Read more: &lt;a href="http://feedproxy.google.com/~r/ScottHanselman/~3/l3J9ESKMLq4/HanselminutesPodcast199HowCraigslistWorksWithJeremyZawodny.aspx"&gt;Hanselminutes Podcast 199 - How Craigslist Works - with Jeremy Zawodny&lt;/a&gt; | &lt;a href="http://feeds.feedburner.com/ScottHanselman"&gt;Subscribe&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/a64V1OfKQZ8M_rhp7jjpTeWKQkM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/a64V1OfKQZ8M_rhp7jjpTeWKQkM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/a64V1OfKQZ8M_rhp7jjpTeWKQkM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/a64V1OfKQZ8M_rhp7jjpTeWKQkM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Sat, 06 Feb 2010 06:47:01 GMT</pubDate>
      <guid>http://feedproxy.google.com/~r/ScottHanselman/~3/l3J9ESKMLq4/HanselminutesPodcast199HowCraigslistWorksWithJeremyZawodny.aspx</guid>
    </item>
 
    <item>
      <title>If you are way off in the deep end, there is only so much that tooling can do for you</title>
      <author>Oren Eini</author>
      <link>http://feedproxy.google.com/~r/AyendeRahien/~3/xbv6oGDapFA/if-you-are-way-off-in-the-deep-end-there.aspx</link>
      <description>&lt;p&gt;I get a lot of requests for what I term, the regex problem. Why the regex problem?&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Some people, when confronted with a problem, think "I know, I’ll use regular expressions." Now they have two problems.&lt;/em&gt; — &lt;a href="ttp://jwz.livejournal.com"&gt;Jamie Zawinski&lt;/a&gt; in comp.lang.emacs.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;A case in point, which comes up repeatedly, is this question:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Can you show us an example for loading collections of collections.     &lt;br /&gt;How would you write a query and avoid a Cartesian product multiple levels deep ?&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;In this case, we have someone who wants to load a blog, all its posts, and all its comments, and do it in the most efficient manner possible. At the same time, they want to have the tool handle that for them. &lt;/p&gt;  &lt;p&gt;Let us take a look at how two different OR/Ms handle this task, then discuss what an optimal solution is.&lt;/p&gt;  &lt;p&gt;First, Entity Framework, using this code:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre class="csharpcode"&gt;db.Blogs
    .Include(&lt;span class="str"&gt;"Posts"&lt;/span&gt;)
    .Include(&lt;span class="str"&gt;"Posts.Comments"&lt;/span&gt;)
    .Where(x =&amp;gt; x.Id == 1)
    .ToList();&lt;/pre&gt;
  &lt;style type="text/css"&gt;&lt;![CDATA[
.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; }]]&gt;&lt;/style&gt;&lt;/blockquote&gt;

&lt;p&gt;This code will generate:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt;   [Project2].[Id]             &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Id],
         [Project2].[Title]          &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Title],
         [Project2].[Subtitle]       &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Subtitle],
         [Project2].[AllowsComments] &lt;span class="kwrd"&gt;AS&lt;/span&gt; [AllowsComments],
         [Project2].[CreatedAt]      &lt;span class="kwrd"&gt;AS&lt;/span&gt; [CreatedAt],
         [Project2].[C1]             &lt;span class="kwrd"&gt;AS&lt;/span&gt; [C1],
         [Project2].[C4]             &lt;span class="kwrd"&gt;AS&lt;/span&gt; [C2],
         [Project2].[Id1]            &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Id1],
         [Project2].[Title1]         &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Title1],
         [Project2].[Text]           &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Text],
         [Project2].[PostedAt]       &lt;span class="kwrd"&gt;AS&lt;/span&gt; [PostedAt],
         [Project2].[BlogId]         &lt;span class="kwrd"&gt;AS&lt;/span&gt; [BlogId],
         [Project2].[UserId]         &lt;span class="kwrd"&gt;AS&lt;/span&gt; [UserId],
         [Project2].[C3]             &lt;span class="kwrd"&gt;AS&lt;/span&gt; [C3],
         [Project2].[C2]             &lt;span class="kwrd"&gt;AS&lt;/span&gt; [C4],
         [Project2].[Id2]            &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Id2],
         [Project2].[Name]           &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Name],
         [Project2].[Email]          &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Email],
         [Project2].[HomePage]       &lt;span class="kwrd"&gt;AS&lt;/span&gt; [HomePage],
         [Project2].[Ip]             &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Ip],
         [Project2].[Text1]          &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Text1],
         [Project2].[PostId]         &lt;span class="kwrd"&gt;AS&lt;/span&gt; [PostId]
&lt;span class="kwrd"&gt;FROM&lt;/span&gt;     (&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; [Extent1].[Id]             &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Id],
                 [Extent1].[Title]          &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Title],
                 [Extent1].[Subtitle]       &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Subtitle],
                 [Extent1].[AllowsComments] &lt;span class="kwrd"&gt;AS&lt;/span&gt; [AllowsComments],
                 [Extent1].[CreatedAt]      &lt;span class="kwrd"&gt;AS&lt;/span&gt; [CreatedAt],
                 1                          &lt;span class="kwrd"&gt;AS&lt;/span&gt; [C1],
                 [Project1].[Id]            &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Id1],
                 [Project1].[Title]         &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Title1],
                 [Project1].[Text]          &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Text],
                 [Project1].[PostedAt]      &lt;span class="kwrd"&gt;AS&lt;/span&gt; [PostedAt],
                 [Project1].[BlogId]        &lt;span class="kwrd"&gt;AS&lt;/span&gt; [BlogId],
                 [Project1].[UserId]        &lt;span class="kwrd"&gt;AS&lt;/span&gt; [UserId],
                 [Project1].[Id1]           &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Id2],
                 [Project1].[Name]          &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Name],
                 [Project1].[Email]         &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Email],
                 [Project1].[HomePage]      &lt;span class="kwrd"&gt;AS&lt;/span&gt; [HomePage],
                 [Project1].[Ip]            &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Ip],
                 [Project1].[Text1]         &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Text1],
                 [Project1].[PostId]        &lt;span class="kwrd"&gt;AS&lt;/span&gt; [PostId],
                 &lt;span class="kwrd"&gt;CASE&lt;/span&gt; 
                   &lt;span class="kwrd"&gt;WHEN&lt;/span&gt; ([Project1].[C1] &lt;span class="kwrd"&gt;IS&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;) &lt;span class="kwrd"&gt;THEN&lt;/span&gt; &lt;span class="kwrd"&gt;CAST&lt;/span&gt;(&lt;span class="kwrd"&gt;NULL&lt;/span&gt; &lt;span class="kwrd"&gt;AS&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt;)
                   &lt;span class="kwrd"&gt;ELSE&lt;/span&gt; &lt;span class="kwrd"&gt;CASE&lt;/span&gt; 
                          &lt;span class="kwrd"&gt;WHEN&lt;/span&gt; ([Project1].[Id1] &lt;span class="kwrd"&gt;IS&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;) &lt;span class="kwrd"&gt;THEN&lt;/span&gt; &lt;span class="kwrd"&gt;CAST&lt;/span&gt;(&lt;span class="kwrd"&gt;NULL&lt;/span&gt; &lt;span class="kwrd"&gt;AS&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt;)
                          &lt;span class="kwrd"&gt;ELSE&lt;/span&gt; 1
                        &lt;span class="kwrd"&gt;END&lt;/span&gt;
                 &lt;span class="kwrd"&gt;END&lt;/span&gt; &lt;span class="kwrd"&gt;AS&lt;/span&gt; [C2],
                 &lt;span class="kwrd"&gt;CASE&lt;/span&gt; 
                   &lt;span class="kwrd"&gt;WHEN&lt;/span&gt; ([Project1].[C1] &lt;span class="kwrd"&gt;IS&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;) &lt;span class="kwrd"&gt;THEN&lt;/span&gt; &lt;span class="kwrd"&gt;CAST&lt;/span&gt;(&lt;span class="kwrd"&gt;NULL&lt;/span&gt; &lt;span class="kwrd"&gt;AS&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt;)
                   &lt;span class="kwrd"&gt;ELSE&lt;/span&gt; &lt;span class="kwrd"&gt;CASE&lt;/span&gt; 
                          &lt;span class="kwrd"&gt;WHEN&lt;/span&gt; ([Project1].[Id1] &lt;span class="kwrd"&gt;IS&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;) &lt;span class="kwrd"&gt;THEN&lt;/span&gt; &lt;span class="kwrd"&gt;CAST&lt;/span&gt;(&lt;span class="kwrd"&gt;NULL&lt;/span&gt; &lt;span class="kwrd"&gt;AS&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt;)
                          &lt;span class="kwrd"&gt;ELSE&lt;/span&gt; 1
                        &lt;span class="kwrd"&gt;END&lt;/span&gt;
                 &lt;span class="kwrd"&gt;END&lt;/span&gt; &lt;span class="kwrd"&gt;AS&lt;/span&gt; [C3],
                 [Project1].[C1]            &lt;span class="kwrd"&gt;AS&lt;/span&gt; [C4]
          &lt;span class="kwrd"&gt;FROM&lt;/span&gt;   [dbo].[Blogs] &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Extent1]
                 &lt;span class="kwrd"&gt;LEFT&lt;/span&gt; &lt;span class="kwrd"&gt;OUTER&lt;/span&gt; &lt;span class="kwrd"&gt;JOIN&lt;/span&gt; (&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; [Extent2].[Id]       &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Id],
                                         [Extent2].[Title]    &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Title],
                                         [Extent2].[Text]     &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Text],
                                         [Extent2].[PostedAt] &lt;span class="kwrd"&gt;AS&lt;/span&gt; [PostedAt],
                                         [Extent2].[BlogId]   &lt;span class="kwrd"&gt;AS&lt;/span&gt; [BlogId],
                                         [Extent2].[UserId]   &lt;span class="kwrd"&gt;AS&lt;/span&gt; [UserId],
                                         [Extent3].[Id]       &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Id1],
                                         [Extent3].[Name]     &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Name],
                                         [Extent3].[Email]    &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Email],
                                         [Extent3].[HomePage] &lt;span class="kwrd"&gt;AS&lt;/span&gt; [HomePage],
                                         [Extent3].[Ip]       &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Ip],
                                         [Extent3].[Text]     &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Text1],
                                         [Extent3].[PostId]   &lt;span class="kwrd"&gt;AS&lt;/span&gt; [PostId],
                                         1                    &lt;span class="kwrd"&gt;AS&lt;/span&gt; [C1]
                                  &lt;span class="kwrd"&gt;FROM&lt;/span&gt;   [dbo].[Posts] &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Extent2]
                                         &lt;span class="kwrd"&gt;LEFT&lt;/span&gt; &lt;span class="kwrd"&gt;OUTER&lt;/span&gt; &lt;span class="kwrd"&gt;JOIN&lt;/span&gt; [dbo].[Comments] &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Extent3]
                                           &lt;span class="kwrd"&gt;ON&lt;/span&gt; [Extent2].[Id] = [Extent3].[PostId]) &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Project1]
                   &lt;span class="kwrd"&gt;ON&lt;/span&gt; [Extent1].[Id] = [Project1].[BlogId]
          &lt;span class="kwrd"&gt;WHERE&lt;/span&gt;  1 = [Extent1].[Id]) &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Project2]
&lt;span class="kwrd"&gt;ORDER&lt;/span&gt; &lt;span class="kwrd"&gt;BY&lt;/span&gt; [Project2].[Id] &lt;span class="kwrd"&gt;ASC&lt;/span&gt;,
         [Project2].[C4] &lt;span class="kwrd"&gt;ASC&lt;/span&gt;,
         [Project2].[Id1] &lt;span class="kwrd"&gt;ASC&lt;/span&gt;,
         [Project2].[C3] ASC&lt;/pre&gt;
  &lt;style type="text/css"&gt;&lt;![CDATA[
.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; }]]&gt;&lt;/style&gt;&lt;/blockquote&gt;

&lt;p&gt;If you’ll look closely, you’ll see that it generate a join between Blogs, Posts and Comments, essentially creating a Cartesian product between all three. &lt;/p&gt;

&lt;p&gt;What about NHibernate? The following code:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;var blogs = s.CreateQuery(
    &lt;span class="str"&gt;@"from Blog b 
        left join fetch b.Posts p 
        left join fetch p.Comments 
    where b.Id = :id"&lt;/span&gt;)
    .SetParameter(&lt;span class="str"&gt;"id"&lt;/span&gt;, 1)
    .List&amp;lt;Blog&amp;gt;();&lt;/pre&gt;
  &lt;style type="text/css"&gt;&lt;![CDATA[
.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; }]]&gt;&lt;/style&gt;&lt;/blockquote&gt;

&lt;p&gt;Will generate a much saner statement: &lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt; blog0_.Id             &lt;span class="kwrd"&gt;as&lt;/span&gt; Id7_0_,
       posts1_.Id            &lt;span class="kwrd"&gt;as&lt;/span&gt; Id0_1_,
       comments2_.Id         &lt;span class="kwrd"&gt;as&lt;/span&gt; Id2_2_,
       blog0_.Title          &lt;span class="kwrd"&gt;as&lt;/span&gt; Title7_0_,
       blog0_.Subtitle       &lt;span class="kwrd"&gt;as&lt;/span&gt; Subtitle7_0_,
       blog0_.AllowsComments &lt;span class="kwrd"&gt;as&lt;/span&gt; AllowsCo4_7_0_,
       blog0_.CreatedAt      &lt;span class="kwrd"&gt;as&lt;/span&gt; CreatedAt7_0_,
       posts1_.Title         &lt;span class="kwrd"&gt;as&lt;/span&gt; Title0_1_,
       posts1_.Text          &lt;span class="kwrd"&gt;as&lt;/span&gt; Text0_1_,
       posts1_.PostedAt      &lt;span class="kwrd"&gt;as&lt;/span&gt; PostedAt0_1_,
       posts1_.BlogId        &lt;span class="kwrd"&gt;as&lt;/span&gt; BlogId0_1_,
       posts1_.UserId        &lt;span class="kwrd"&gt;as&lt;/span&gt; UserId0_1_,
       posts1_.BlogId        &lt;span class="kwrd"&gt;as&lt;/span&gt; BlogId0__,
       posts1_.Id            &lt;span class="kwrd"&gt;as&lt;/span&gt; Id0__,
       comments2_.Name       &lt;span class="kwrd"&gt;as&lt;/span&gt; Name2_2_,
       comments2_.Email      &lt;span class="kwrd"&gt;as&lt;/span&gt; Email2_2_,
       comments2_.HomePage   &lt;span class="kwrd"&gt;as&lt;/span&gt; HomePage2_2_,
       comments2_.Ip         &lt;span class="kwrd"&gt;as&lt;/span&gt; Ip2_2_,
       comments2_.Text       &lt;span class="kwrd"&gt;as&lt;/span&gt; Text2_2_,
       comments2_.PostId     &lt;span class="kwrd"&gt;as&lt;/span&gt; PostId2_2_,
       comments2_.PostId     &lt;span class="kwrd"&gt;as&lt;/span&gt; PostId1__,
       comments2_.Id         &lt;span class="kwrd"&gt;as&lt;/span&gt; Id1__
&lt;span class="kwrd"&gt;from&lt;/span&gt;   Blogs blog0_
       &lt;span class="kwrd"&gt;left&lt;/span&gt; &lt;span class="kwrd"&gt;outer&lt;/span&gt; &lt;span class="kwrd"&gt;join&lt;/span&gt; Posts posts1_
         &lt;span class="kwrd"&gt;on&lt;/span&gt; blog0_.Id = posts1_.BlogId
       &lt;span class="kwrd"&gt;left&lt;/span&gt; &lt;span class="kwrd"&gt;outer&lt;/span&gt; &lt;span class="kwrd"&gt;join&lt;/span&gt; Comments comments2_
         &lt;span class="kwrd"&gt;on&lt;/span&gt; posts1_.Id = comments2_.PostId
&lt;span class="kwrd"&gt;where&lt;/span&gt;  blog0_.Id = 1 /* @p0 */&lt;/pre&gt;
  &lt;style type="text/css"&gt;&lt;![CDATA[
.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; }]]&gt;&lt;/style&gt;&lt;/blockquote&gt;

&lt;p&gt;While this is a saner statement, it will also generate a Cartesian product. There are no two ways about it, this is &lt;em&gt;bad bad bad bad&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;And the way to do that is quite simple, don’t try to do it in a single query, instead, we can break it up into multiple queries, each loading just a part of the graph and rely on the Identity Map implementation to stitch the graph together.  You can read the &lt;a href="http://ayende.com/Blog/archive/2010/01/16/eagerly-loading-entity-associations-efficiently-with-nhibernate.aspx"&gt;post about it here&lt;/a&gt;. Doing this may require more work on your part, but it will end up being much faster, and it is also something that would be much easier to write, maintain and work with.&lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/11304.aspx" width="1" height="1" /&gt;&lt;p&gt;&lt;a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/AYENDE/51DAD750700E3D0D7DD741EB5EB4DC23C256E0DE"&gt;&lt;img src="http://theloungenet.com/feeds/img/DOTNETRSS/AYENDE/51DAD750700E3D0D7DD741EB5EB4DC23C256E0DE"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AyendeRahien/~4/xbv6oGDapFA" height="1" width="1"/&gt; &lt;hr /&gt;Read more: &lt;a href="http://feedproxy.google.com/~r/AyendeRahien/~3/xbv6oGDapFA/if-you-are-way-off-in-the-deep-end-there.aspx"&gt;If you are way off in the deep end, there is only so much that tooling can do for you&lt;/a&gt; | &lt;a href="http://feeds.feedburner.com/AyendeRahien"&gt;Subscribe&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/UQoTzQylGeymIWrjnhtiP0DvbqI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UQoTzQylGeymIWrjnhtiP0DvbqI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/UQoTzQylGeymIWrjnhtiP0DvbqI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UQoTzQylGeymIWrjnhtiP0DvbqI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Fri, 05 Feb 2010 15:00:00 GMT</pubDate>
      <guid>http://feedproxy.google.com/~r/AyendeRahien/~3/xbv6oGDapFA/if-you-are-way-off-in-the-deep-end-there.aspx</guid>
    </item>
 
  </channel>
</rss>
