<rss version="2.0" 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/"><channel><title>K. Scott Allen</title><link>http://odetocode.com/Blogs/scott/default.aspx</link><description>Experiments in writing</description><dc:language>en-US</dc:language><generator>CommunityServer 1.1 (Build: 1.1.0.50615)</generator><item><title>The Power of Programming With Attributes</title><link>http://odetocode.com/Blogs/scott/archive/2008/05/13/12078.aspx</link><pubDate>Wed, 14 May 2008 05:41:00 GMT</pubDate><guid isPermaLink="false">2a1db9d5-42e2-4e6d-a60a-04dde226509f:12078</guid><dc:creator>scott</dc:creator><slash:comments>13</slash:comments><comments>http://odetocode.com/Blogs/scott/comments/12078.aspx</comments><wfw:commentRss>http://odetocode.com/Blogs/scott/commentrss.aspx?PostID=12078</wfw:commentRss><description>&lt;p&gt;Nothing can compare to the Real Power of programming with attributes. Why, just one pair of square brackets and &lt;em&gt;woosh &lt;/em&gt;– my object can be serialize to XML. &lt;em&gt;Woosh – &lt;/em&gt;my object can persist to a database table. &lt;em&gt;Woosh – &lt;/em&gt;there goes my object over the wire in a digitally signed SOAP payload. One day I expect to see a new item template in Visual Studio – the "&lt;b&gt;Add New All Powerful Attributed Class&lt;/b&gt;" template: *&lt;br&gt;
&lt;/p&gt;
&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
[&lt;span style="color: rgb(43, 145, 175);"&gt;Table&lt;/span&gt;&lt;span style="color: black;"&gt;]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
[&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;DataObject&lt;/span&gt;&lt;span style="color: black;"&gt;]&lt;br&gt;
[&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;DataContract&lt;/span&gt;&lt;span style="color: black;"&gt;]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
[&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Serializable&lt;/span&gt;&lt;span style="color: black;"&gt;]&lt;br&gt;
[&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;TwoKitchenSinks&lt;/span&gt;&lt;span style="color: black;"&gt;]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;
[&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;CLSCompliant&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: Blue;"&gt;true&lt;/span&gt;&lt;span style="color: black;"&gt;)]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
[&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;DefaultProperty&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"Name"&lt;/span&gt;&lt;span style="color: black;"&gt;)]&lt;br&gt;
[&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;DefaultBindingProperty&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"Name"&lt;/span&gt;&lt;span style="color: black;"&gt;)]&lt;br&gt;
[&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;DebuggerStepThroughAttribute&lt;/span&gt;&lt;span style="color: black;"&gt;]&lt;br&gt;
[&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;GuidAttribute&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"F0DD2CAA-2132-11DD-AC50-FE9355D89593"&lt;/span&gt;&lt;span style="color: black;"&gt;)]&lt;br&gt;
&lt;/span&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Person&lt;br&gt;
&lt;/span&gt;&lt;span style="color: black;"&gt;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Column&lt;/span&gt;&lt;span style="color: black;"&gt;]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;DataMember&lt;/span&gt;&lt;span style="color: black;"&gt;]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;XmlAttribute&lt;/span&gt;&lt;span style="color: black;"&gt;]&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Browsable&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: Blue;"&gt;true&lt;/span&gt;&lt;span style="color: black;"&gt;)]&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;ReadOnly&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: Blue;"&gt;false&lt;/span&gt;&lt;span style="color: black;"&gt;)]&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Category&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"Advanced"&lt;/span&gt;&lt;span style="color: black;"&gt;)]&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Description&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"The person's name"&lt;/span&gt;&lt;span style="color: black;"&gt;)]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;string&lt;/span&gt;&lt;span style="color: black;"&gt; Name { &lt;/span&gt;&lt;span style="color: Blue;"&gt;get&lt;/span&gt;&lt;span style="color: black;"&gt;; &lt;/span&gt;&lt;span style="color: Blue;"&gt;set&lt;/span&gt;&lt;span style="color: black;"&gt;; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Green;"&gt;// TODO: YOUR INSIGNIFIGANT BIZ LOGIC GOES HERE...&lt;br&gt;
&lt;/span&gt;&lt;span style="color: black;"&gt;}&lt;br&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;Which begs the question – could there ever be a way to separate attributes from the class definition?**
&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;* Put down the flamethrower and step away - I'm kidding.&lt;/font&gt;
&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;**This part was a serious question.&lt;/font&gt;  &lt;/p&gt;&lt;img src="http://odetocode.com/Blogs/aggbug.aspx?PostID=12078" width="1" height="1"&gt;</description></item><item><title>Two LINQ to SQL Myths</title><link>http://odetocode.com/Blogs/scott/archive/2008/05/11/12074.aspx</link><pubDate>Mon, 12 May 2008 06:47:00 GMT</pubDate><guid isPermaLink="false">2a1db9d5-42e2-4e6d-a60a-04dde226509f:12074</guid><dc:creator>scott</dc:creator><slash:comments>3</slash:comments><comments>http://odetocode.com/Blogs/scott/comments/12074.aspx</comments><wfw:commentRss>http://odetocode.com/Blogs/scott/commentrss.aspx?PostID=12074</wfw:commentRss><description>&lt;p&gt;&lt;b&gt;LINQ to SQL requires you to start with a database schema.&lt;/b&gt; 
&lt;/p&gt;&lt;p&gt;Not true – you can start with code and create mappings later.  In fact, you can write plain-old CLR object like this:
&lt;/p&gt;
&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
&lt;span style="color: Blue;"&gt;class&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Movie&lt;br&gt;
&lt;/span&gt;&lt;span style="color: black;"&gt;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;int&lt;/span&gt;&lt;span style="color: black;"&gt; ID { &lt;/span&gt;&lt;span style="color: Blue;"&gt;get&lt;/span&gt;&lt;span style="color: black;"&gt;; &lt;/span&gt;&lt;span style="color: Blue;"&gt;set&lt;/span&gt;&lt;span style="color: black;"&gt;; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;string&lt;/span&gt;&lt;span style="color: black;"&gt; Title { &lt;/span&gt;&lt;span style="color: Blue;"&gt;get&lt;/span&gt;&lt;span style="color: black;"&gt;; &lt;/span&gt;&lt;span style="color: Blue;"&gt;set&lt;/span&gt;&lt;span style="color: black;"&gt;; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;DateTime&lt;/span&gt;&lt;span style="color: black;"&gt; ReleaseDate { &lt;/span&gt;&lt;span style="color: Blue;"&gt;get&lt;/span&gt;&lt;span style="color: black;"&gt;; &lt;/span&gt;&lt;span style="color: Blue;"&gt;set&lt;/span&gt;&lt;span style="color: black;"&gt;; }&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;… and later either create a mapping file (full of XML like &amp;lt;Table&amp;gt; and &amp;lt;Column&amp;gt;), or decorate the class with mapping attributes (like [Table] and [Column]). You can even use the mapping to create a fresh database schema via the CreateDatabase method of the DataContext class.&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;LINQ to SQL requires your classes to implement INotifyPropertyChanged and use EntitySet&amp;lt;T&amp;gt; for any associated collections.&lt;/b&gt; 
&lt;/p&gt;&lt;p&gt;Not true, although foregoing either does come with a price. INotifyPropertyChanged allows LINQ to SQL to track changes on your objects. If you don't implement this interface LINQ to SQL can still discover changes for update scenarios, but will take snapshots of all objects, which isn't free.  Likewise, EntitySet provides deferred loading and association management for one-to-one and one-to-many relationships between entities. You can build this yourself, but with EntitySet being built on top of IList&amp;lt;T&amp;gt;, you'll probably be recreating the same wheel. There is nothing about EntitySet&amp;lt;T&amp;gt; that ties the class to LINQ to SQL (other than living inside the System.Data.Linq namespace).
&lt;/p&gt;&lt;p&gt;LINQ to SQL has limitations and it's a v1 product, but don't think of LINQ to SQL as &lt;i&gt;strictly&lt;/i&gt; a drag and drop technology. &lt;/p&gt;&lt;img src="http://odetocode.com/Blogs/aggbug.aspx?PostID=12074" width="1" height="1"&gt;</description></item><item><title>Mr. President the Programmer</title><link>http://odetocode.com/Blogs/scott/archive/2008/05/07/12064.aspx</link><pubDate>Thu, 08 May 2008 04:12:00 GMT</pubDate><guid isPermaLink="false">2a1db9d5-42e2-4e6d-a60a-04dde226509f:12064</guid><dc:creator>scott</dc:creator><slash:comments>1</slash:comments><comments>http://odetocode.com/Blogs/scott/comments/12064.aspx</comments><wfw:commentRss>http://odetocode.com/Blogs/scott/commentrss.aspx?PostID=12064</wfw:commentRss><description>&lt;p&gt;&lt;font size="2"&gt;&lt;b&gt;Daily Standup Transcription 06 May 2008 1300 Zulu &lt;br&gt;Time In 00:02:34.66&lt;/b&gt;&lt;/font&gt;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;"… so, yesterday I continued the refactorafication of some classes. The job isn't easy, but I'm going to work hard and continue the collaborativity with my programming partner. Together, we will eliminate the evil of legacy code operating inside the code base.
&lt;/p&gt;&lt;p&gt;I know it's been slow going, but we did misundestimerate the threat of static ... static … statictistical dependencies in the code. 
&lt;/p&gt;&lt;p&gt;Now, if you'll excuse me, I need to get back to work for the great customers of this company."
&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;b&gt;&lt;font size="2"&gt;Time Out 00:02:54.29&lt;/font&gt;&lt;/b&gt; 
&lt;/p&gt;&lt;img src="http://odetocode.com/Blogs/aggbug.aspx?PostID=12064" width="1" height="1"&gt;</description></item><item><title>There Is Always Risk In Portability</title><link>http://odetocode.com/Blogs/scott/archive/2008/05/06/12060.aspx</link><pubDate>Wed, 07 May 2008 06:48:00 GMT</pubDate><guid isPermaLink="false">2a1db9d5-42e2-4e6d-a60a-04dde226509f:12060</guid><dc:creator>scott</dc:creator><slash:comments>1</slash:comments><comments>http://odetocode.com/Blogs/scott/comments/12060.aspx</comments><wfw:commentRss>http://odetocode.com/Blogs/scott/commentrss.aspx?PostID=12060</wfw:commentRss><description>&lt;p&gt;&lt;img src="http://www.OdeToCode.com/aimages/200805/050708_0348_ThereIsAlwa1.jpg" alt="roll the dice with LINQ" align="right"&gt;After my &lt;a href="http://odetocode.com/Blogs/scott/archive/2008/05/05/12054.aspx"&gt;last post&lt;/a&gt;, someone asked me if the "portable" repository pattern was really a good idea. He was referring to the fact the LINQ queries in the &lt;a href="http://www.codeplex.com/mvcsamples"&gt;MVC Storefront&lt;/a&gt; and &lt;a href="http://www.codeplex.com/backgroundmotion"&gt;Background Motion&lt;/a&gt; applications would sometimes execute against in-memory collections (for unit testing), while the rest of the time the queries would execute against a relational database. Isn't there a huge risk in developers not knowing if the software really works with the database?
&lt;/p&gt;&lt;p&gt;I don't think of the repository as a "portability" layer, although since it is an abstraction layered on top of the data access code it can provide some nice indirections, like the ability to switch the persistence store. Is this risky? Sure, there is always some element of risk in portability. Just ask anyone who has written code with a portable UI toolkit, or in HTML for that matter. You don't know what is going to happen until the 1s and 0s hit the silicon. 
&lt;/p&gt;&lt;p&gt;But …
&lt;/p&gt;&lt;p&gt;That's not the job for unit tests. Ideally, you'll have some other tests to verify what happens when the "production" code runs. 
&lt;/p&gt;&lt;p&gt;Before continuing, I must say that in the last post I neglected to tell you that the brainy &lt;a href="http://www.mindscape.co.nz/"&gt;Mindscape&lt;/a&gt; team and &lt;a href="http://andrewpeters.net/"&gt;Andrew Peters&lt;/a&gt; are responsible for the &lt;a href="http://backgroundmotion.com/"&gt;Background Motion&lt;/a&gt; web site, and the code that powers the site. Make sure to visit the site and marvel at the &lt;a href="http://backgroundmotion.com/View.aspx?id=77"&gt;beauty of New Zealand&lt;/a&gt;, then drop into the Mindscape &lt;a href="http://www.mindscape.co.nz/blog/"&gt;blogs&lt;/a&gt;. Everyone - let's hear it for New Zealand!
&lt;/p&gt;&lt;h1&gt;What Is This Risk You Speak Of?
&lt;/h1&gt;&lt;p&gt;You can write a LINQ query that works fine against in-memory collections, but that can fail spectacularly when you swap in a remote LINQ provider. Here is an obvious example:
&lt;/p&gt;&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
&lt;span style="color: Blue;"&gt;var&lt;/span&gt;&lt;span style="color: black;"&gt; result =&lt;br&gt;
&lt;/span&gt;&lt;span style="color: Blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from&lt;/span&gt;&lt;span style="color: black;"&gt; a &lt;/span&gt;&lt;span style="color: Blue;"&gt;in&lt;/span&gt;&lt;span style="color: black;"&gt; dc.Addresses&lt;br&gt;
&lt;/span&gt;&lt;span style="color: Blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where&lt;/span&gt;&lt;span style="color: black;"&gt; !&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;String&lt;/span&gt;&lt;span style="color: black;"&gt;.IsNullOrEmpty(a.PostalCode)&lt;br&gt;
&lt;/span&gt;&lt;span style="color: Blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select&lt;/span&gt;&lt;span style="color: black;"&gt; a;&lt;br&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;This query is happy to execute using LINQ to Objects, but it fails with an exception if LINQ to SQL is sitting behind the sequence (NotSupportedException: Method 'Boolean IsNullOrEmpty(System.String)' has no supported translation to SQL). 
&lt;/p&gt;&lt;p&gt;Those types of problems are easy to spot in automated integration testing because exceptions are relatively easy to track down. The real risk is in the queries that don't flame out in spectacular fashion, but execute successfully with slight variations. Here is one example:
&lt;/p&gt;
&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
&lt;span style="color: Blue;"&gt;var&lt;/span&gt;&lt;span style="color: black;"&gt; distinctPostalCodes =&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
(&lt;br&gt;
 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
 &lt;/span&gt;&lt;span style="color: Blue;"&gt;from&lt;/span&gt;&lt;span style="color: black;"&gt; a &lt;/span&gt;&lt;span style="color: Blue;"&gt;in&lt;/span&gt;&lt;span style="color: black;"&gt; addresses&lt;br&gt;
 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
 &lt;/span&gt;&lt;span style="color: Blue;"&gt;orderby&lt;/span&gt;&lt;span style="color: black;"&gt; a.State &lt;/span&gt;&lt;span style="color: Blue;"&gt;ascending&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; { a.PostalCode, a.State }&lt;br&gt;
 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
 ).Distinct();&lt;br&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;This query wants to get distinct list of zip codes and states for all our customers, and order the list by state. Works perfectly with LINQ to objects, and executes successfully in LINQ to SQL. Just one tiny problem you might observe in the generated SQL:
&lt;/p&gt;
&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
SELECT DISTINCT [t0].[PostalCode], [t0].[State] FROM [dbo].[&lt;span style="color: rgb(43, 145, 175);"&gt;Address&lt;/span&gt;&lt;span style="color: black;"&gt;] AS [t0]&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;Notice the distinct (pardon the pun) lack of an ORDER BY clause. If the upper layers were expecting the results sorted by State then we have problems. 
&lt;/p&gt;&lt;p&gt;It turns out that LINQ to SQL throws out an inner OrderBy operator when the Distinct operator comes into play. This could be for several reasons, but the most likely reason is DISTINCT and ORDER BY have an uneasy relationship in ANSI SQL (it's not just MS SQL). You can read more about this on Jeff Smith's blog: &lt;a href="http://weblogs.sqlteam.com/jeffs/archive/2007/12/13/select-distinct-order-by-error.aspx"&gt;SELECT DISTINCT and ORDER BY&lt;/a&gt;, and there is another good explanation here: &lt;a href="http://decipherinfosys.wordpress.com/2007/12/22/some-common-mis-conceptions-about-distinct/" title="Permanent Link to Some common mis-conceptions about DISTINCT"&gt;Some Common Mis-conceptions about DISTINCT&lt;/a&gt;. 
&lt;/p&gt;&lt;p&gt;One also has to wonder if Distinct might reorder the results in its quest to remove duplicates - it's not explicitly documented that it doesn't. In this case, it's better to forego the query comprehension syntax and make the pipeline of operators more explicit:
&lt;/p&gt;
&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
&lt;span style="color: Blue;"&gt;var&lt;/span&gt;&lt;span style="color: black;"&gt; distinctPostalCodes =&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
addresses.Select(a =&amp;gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; { a.PostalCode, a.State })&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Distinct()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .OrderBy(a =&amp;gt; a.State);&lt;br&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;This forces LINQ to SQL to generate a safe query with the expected results. 
&lt;/p&gt;&lt;p&gt;Is there risk? Sure – and it's not just in LINQ to SQL. Any multi-target technology runs the same risk. You just need an awareness and safety net (in the form of tests) to mitigate the risk. 
&lt;/p&gt;&lt;img src="http://odetocode.com/Blogs/aggbug.aspx?PostID=12060" width="1" height="1"&gt;</description></item><item><title>Contrasting Two MVC / LINQ to SQL Applications for the Web</title><link>http://odetocode.com/Blogs/scott/archive/2008/05/05/12054.aspx</link><pubDate>Tue, 06 May 2008 06:10:00 GMT</pubDate><guid isPermaLink="false">2a1db9d5-42e2-4e6d-a60a-04dde226509f:12054</guid><dc:creator>scott</dc:creator><slash:comments>5</slash:comments><comments>http://odetocode.com/Blogs/scott/comments/12054.aspx</comments><wfw:commentRss>http://odetocode.com/Blogs/scott/commentrss.aspx?PostID=12054</wfw:commentRss><description>&lt;p&gt;There are two applications on CodePlex that are interesting to compare and contrast. The &lt;a href="http://www.codeplex.com/mvcsamples"&gt;MVC Storefront&lt;/a&gt; and &lt;a href="http://www.codeplex.com/backgroundmotion"&gt;Background Motion&lt;/a&gt;. 
&lt;/p&gt;&lt;h1&gt;MVC Storefront
&lt;/h1&gt;&lt;p&gt;MVC Storefront is &lt;a href="http://blog.wekeroad.com"&gt;Rob Conery's&lt;/a&gt; work. You can watch Rob lift up the grass skirt as he builds this application in a series of webcasts (&lt;a href="http://blog.wekeroad.com/mvc-storefront/mvcstore-part-8/"&gt;currently up to Part 8&lt;/a&gt;). Rob is using the ASP.NET MVC framework and LINQ to SQL. The Storefront is a work in progress and Rob is actively soliciting feedback on what you want to see. 
&lt;/p&gt;&lt;p&gt;At the it's lowest level, the Storefront uses a repository type pattern.
&lt;/p&gt;
&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;interface&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;ICatalogRepository&lt;/span&gt;&lt;span style="color: black;"&gt; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IQueryable&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Category&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt; GetCategories();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IQueryable&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Product&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt; GetProducts();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IQueryable&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;ProductReview&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt; GetReviews();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IQueryable&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;ProductImage&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt; GetProductImages();&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;The repository interface is implemented by a TestCatalogRepository (for testing), and a SqlCatalogRepository (when the application needs to get real work done). Rob uses the repositories to map the LINQ to SQL generated classes into his own model, like the following code that maps a ProductImage (the LINQ generated class with a [Table] attribute) into a ProductImage (the Storefront domain class). 
&lt;/p&gt;
&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IQueryable&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;ProductImage&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt; GetProductImages() {&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;from&lt;/span&gt;&lt;span style="color: black;"&gt; i &lt;/span&gt;&lt;span style="color: Blue;"&gt;in&lt;/span&gt;&lt;span style="color: black;"&gt; ReadOnlyContext.ProductImages&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: Blue;"&gt;select&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;ProductImage&lt;br&gt;
&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID = i.ProductImageID,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProductID = i.ProductID,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ThumbnailPhoto = i.ThumbUrl,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FullSizePhoto = i.FullImageUrl&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;Notice the repository also allows IQueryable to "float up", which defers the query execution. The repositories are consumed by a service layer that the application uses to pull data. Here is an excerpt of the CatalogService. 
&lt;/p&gt;
&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Category&lt;/span&gt;&lt;span style="color: black;"&gt; GetCategory(&lt;/span&gt;&lt;span style="color: Blue;"&gt;int&lt;/span&gt;&lt;span style="color: black;"&gt; id) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Category&lt;/span&gt;&lt;span style="color: black;"&gt; result = _repository.GetCategories()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.WithCategoryID(id)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.SingleOrDefault();&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&lt;span style="color: black;"&gt; result;&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;Controllers in the web application then consume the CatalogService. 
&lt;/p&gt;
&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;ActionResult&lt;/span&gt;&lt;span style="color: black;"&gt; Show(&lt;/span&gt;&lt;span style="color: Blue;"&gt;string&lt;/span&gt;&lt;span style="color: black;"&gt; productcode) {&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;CatalogData&lt;/span&gt;&lt;span style="color: black;"&gt; data = &lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;CatalogData&lt;/span&gt;&lt;span style="color: black;"&gt;();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;CatalogService&lt;/span&gt;&lt;span style="color: black;"&gt; svc = &lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;CatalogService&lt;/span&gt;&lt;span style="color: black;"&gt;(_repository);&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data.Categories = svc.GetCategories();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data.Product = svc.GetProduct(productcode);&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&lt;span style="color: black;"&gt; RenderView(&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"Show"&lt;/span&gt;&lt;span style="color: black;"&gt;,data);&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;Another interesting abstraction in Rob's project is LazyList&amp;lt;T&amp;gt; - an implementation of IList&amp;lt;T&amp;gt; that wraps an IQueryable&amp;lt;T&amp;gt; to provide lazy loading of a collection. LINQ to SQL provides this behavior with the EntitySet&amp;lt;T&amp;gt;, but Rob is isolating his upper layers from LINQ to SQL needs a different strategy. I'm not a fan of the GetCategories method in CatalogService – that looks like join that the repository should put together for the service, and the service layer itself doesn't appear to add a tremendous amount of value, but overall the code is easy to follow and tests are provided. Keep it up, Rob! 
&lt;/p&gt;&lt;h1&gt;Background Motion
&lt;/h1&gt;&lt;p&gt;The Background Motion (BM) project carries significantly more architectural weight. Not saying this is better or worse, but you know any project using the &lt;a href="http://www.codeplex.com/websf"&gt;Web Client Software Factory&lt;/a&gt; is not going to be short on abstractions and indirections. 
&lt;/p&gt;&lt;p&gt;Unlike the Storefront app, the BM app uses a model that is decorated with LINQ to SQL attributes like [Table] and [Column]. BM has a more traditional repository pattern and leverages both generics and expression trees to give the repository more functionality and flexibility. 
&lt;/p&gt;
&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;interface&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IRepository&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;T&amp;gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;where&lt;/span&gt;&lt;span style="color: black;"&gt; T : &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IIdentifiable&lt;br&gt;
&lt;/span&gt;&lt;span style="color: black;"&gt;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;int&lt;/span&gt;&lt;span style="color: black;"&gt; Count();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;int&lt;/span&gt;&lt;span style="color: black;"&gt; Count(&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Expression&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Func&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;T, &lt;/span&gt;&lt;span style="color: Blue;"&gt;bool&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&amp;gt; expression);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;void&lt;/span&gt;&lt;span style="color: black;"&gt; Add(T entity);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;void&lt;/span&gt;&lt;span style="color: black;"&gt; Remove(T entity);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;void&lt;/span&gt;&lt;span style="color: black;"&gt; Save(T entity);&lt;br&gt;
&amp;nbsp;&amp;nbsp;T FindOne(&lt;/span&gt;&lt;span style="color: Blue;"&gt;int&lt;/span&gt;&lt;span style="color: black;"&gt; id);&lt;br&gt;
&amp;nbsp;&amp;nbsp;T FindOne(&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Expression&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Func&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;T, &lt;/span&gt;&lt;span style="color: Blue;"&gt;bool&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&amp;gt; expression);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;bool&lt;/span&gt;&lt;span style="color: black;"&gt; TryFindOne(&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Expression&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Func&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;T, &lt;/span&gt;&lt;span style="color: Blue;"&gt;bool&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&amp;gt; expression, &lt;/span&gt;&lt;span style="color: Blue;"&gt;out&lt;/span&gt;&lt;span style="color: black;"&gt; T entity);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IList&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;T&amp;gt; FindAll();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IList&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;T&amp;gt; FindAll(&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Expression&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Func&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;T, &lt;/span&gt;&lt;span style="color: Blue;"&gt;bool&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&amp;gt; expression);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IQueryable&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;T&amp;gt; Find();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IQueryable&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;T&amp;gt; Find(&lt;/span&gt;&lt;span style="color: Blue;"&gt;int&lt;/span&gt;&lt;span style="color: black;"&gt; id);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IQueryable&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;T&amp;gt; Find(&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Expression&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Func&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;T, &lt;/span&gt;&lt;span style="color: Blue;"&gt;bool&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&amp;gt; expression);&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;Notice the BM repositories will "float up" a deferred query into higher layers by returning an IQueryable, and allow higher layers to "push down" a specification in the form of an expression tree. Combining this technique with generics means you get a single repository implementation for all entities and minimal code. Here is the DLinqRepository implementation of IRepository&amp;lt;T&amp;gt;'s Find method. 
&lt;/p&gt;
&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;override&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IQueryable&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;T&amp;gt; Find(&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Expression&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Func&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;T, &lt;/span&gt;&lt;span style="color: Blue;"&gt;bool&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&amp;gt; expression)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&lt;span style="color: black;"&gt; DataContext.GetTable&amp;lt;T&amp;gt;().Where(expression);&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;Where FindOne can be used like so:
&lt;/p&gt;
&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
&lt;span style="color: rgb(43, 145, 175);"&gt;Member&lt;/span&gt;&lt;span style="color: black;"&gt; member = &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Repository&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Member&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;.FindOne(m =&amp;gt; m.HashCookie == cookieValue);&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;BM combines the repositories with a unit of work pattern and consumthines both directly in the website controllers. 
&lt;/p&gt;
&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IList&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Contribution&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt; GetMostRecentByContentType(&lt;/span&gt;&lt;span style="color: Blue;"&gt;int&lt;/span&gt;&lt;span style="color: black;"&gt; contentTypeId, &lt;/span&gt;&lt;span style="color: Blue;"&gt;int&lt;/span&gt;&lt;span style="color: black;"&gt; skip)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;using&lt;/span&gt;&lt;span style="color: black;"&gt; (&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;UnitOfWork&lt;/span&gt;&lt;span style="color: black;"&gt;.Begin())&lt;br&gt;
&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&lt;span style="color: black;"&gt; ModeratedContributions&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Where(c =&amp;gt; c.ContentTypeId == contentTypeId)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.OrderByDescending(c =&amp;gt; c.AddedOn)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Skip(skip)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Take(&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Constants&lt;/span&gt;&lt;span style="color: black;"&gt;.PageSize).ToList();&lt;br&gt;
&amp;nbsp;&amp;nbsp;}&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;The Background Motion project provides stubbed implementation of all the required repositories and an in-memory unit of work class for unit testing, although the test names leave something to be desired. One of the interesting classes in the BM project is LinqContainsPredicateBuilder – a class whose Build method takes a collection of objects and a target property name. The Build method returns an expression tree that checks to see if the target property equals any of the values in the collection (think of the IN clause in SQL).&amp;nbsp; 
&lt;/p&gt;
If you want to see Background Motion in action, check out &lt;a href="http://backgroundmotion.com/"&gt;backgroundmotion.com&lt;/a&gt;!&lt;br&gt;&lt;img src="http://odetocode.com/Blogs/aggbug.aspx?PostID=12054" width="1" height="1"&gt;</description></item><item><title>The XML Namespace Tax</title><link>http://odetocode.com/Blogs/scott/archive/2008/05/04/12047.aspx</link><pubDate>Mon, 05 May 2008 04:12:00 GMT</pubDate><guid isPermaLink="false">2a1db9d5-42e2-4e6d-a60a-04dde226509f:12047</guid><dc:creator>scott</dc:creator><slash:comments>7</slash:comments><comments>http://odetocode.com/Blogs/scott/comments/12047.aspx</comments><wfw:commentRss>http://odetocode.com/Blogs/scott/commentrss.aspx?PostID=12047</wfw:commentRss><description>&lt;p&gt;While XML literal features in Visual Basic &lt;a href="http://blogs.msdn.com/wriju/archive/2008/02/07/vb-net-9-0-xml-literal.aspx"&gt;get all the love&lt;/a&gt;, the new XElement API for the CLR makes working with XML in C# a bit more fun, too. It's a prime cut of functional programming spiced with syntactic sugar. 
&lt;/p&gt;&lt;p&gt;One example is how the API works with XML namespaces. When namespaces are present, they demand attention in almost every XML operation you can perform. It's like a tax you need to pay that doesn't pay back any benefits. An old poll on &lt;a href="http://xml.org/xml/xmldev.shtml"&gt;xml-dev&lt;/a&gt; once asked people to list their "favorite five bad problems" with XML, to which Peter Hunsberger &lt;a href="http://lists.xml.org/archives/xml-dev/200410/msg00428.html"&gt;replied&lt;/a&gt;:
&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Namespaces
&lt;/li&gt;&lt;li&gt;Namespaces
&lt;/li&gt;&lt;li&gt;Namespaces
&lt;/li&gt;&lt;li&gt;Namespaces
&lt;/li&gt;&lt;li&gt;Namespaces
&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;And in a different &lt;a href="http://lists.xml.org/archives/xml-dev/200410/msg00457.html"&gt;message&lt;/a&gt;, Joe English hit the nail on the head:
&lt;/p&gt;&lt;p style="margin-left: 36pt;"&gt;I'd rather treat element type names and attribute names as simple, atomic strings. This is possible with a sane API, &lt;strong&gt;&lt;em&gt;but most XML APIs aren't sane&lt;/em&gt;&lt;/strong&gt;.
&lt;/p&gt;&lt;p&gt;The API we had pre .NET 3.5 was a fill-out-this-form-in-triplicate-and-wait-quietly-in-line bureaucracy living inside System.Xml. The new API tries to be a bit saner:
&lt;/p&gt;
    &lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
        &lt;span style="color: rgb(43, 145, 175);"&gt;XNamespace&lt;/span&gt;&lt;span style="color: black;"&gt; xmlns =
        &lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"http://schemas.foo.com/widgets"&lt;/span&gt;&lt;span style="color: black;"&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
            &lt;br&gt;
        &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;XDocument&lt;/span&gt;&lt;span style="color: black;"&gt; doc
            = &lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;
        &lt;span style="color: rgb(43, 145, 175);"&gt;XDocument&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;br&gt;
            &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt;
            &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;XElement&lt;/span&gt;&lt;span style="color: black;"&gt;(xmlns
                + &lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"Widgets"&lt;/span&gt;&lt;span style="color: black;"&gt;,&lt;br&gt;
                    &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;XElement&lt;/span&gt;&lt;span style="color: black;"&gt;(xmlns
                            + &lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"Widget"&lt;/span&gt;&lt;span style="color: black;"&gt;,
                            &lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt;
        &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;XAttribute&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"ID"&lt;/span&gt;&lt;span style="color: black;"&gt;, 1)),&lt;br&gt;
                &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;XElement&lt;/span&gt;&lt;span style="color: black;"&gt;(xmlns
                        + &lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"Widget"&lt;/span&gt;&lt;span style="color: black;"&gt;,
                        &lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt;
        &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;XAttribute&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"ID"&lt;/span&gt;&lt;span style="color: black;"&gt;, 2))));&lt;br&gt;&lt;br&gt;
            &lt;/span&gt;
    &lt;/div&gt;
&lt;p&gt;Which produces:
&lt;/p&gt;
    &lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
        &lt;span style="color: Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;Widgets&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Red;"&gt;xmlns&lt;/span&gt;&lt;span style="color: Blue;"&gt;="http://schemas.foo.com/widgets"&amp;gt;&lt;br&gt;
            &lt;/span&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;Widget&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Red;"&gt;
                    ID&lt;/span&gt;&lt;span style="color: Blue;"&gt;="1"&lt;/span&gt;&lt;span style="color: black;"&gt;
                    &lt;/span&gt;&lt;span style="color: Blue;"&gt;/&amp;gt;&lt;br&gt;
                    &lt;/span&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;Widget&lt;/span&gt;&lt;span style="color: black;"&gt;
        &lt;/span&gt;&lt;span style="color: Red;"&gt;ID&lt;/span&gt;&lt;span style="color: Blue;"&gt;="2"&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;/&amp;gt;&lt;br&gt;
                &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;Widgets&lt;/span&gt;&lt;span style="color: Blue;"&gt;&amp;gt;&lt;/span&gt;
    &lt;/div&gt;

&lt;p&gt;It's little things you don't notice at first that makes the API easier. Like &lt;a href="http://msdn2.microsoft.com/en-us/library/system.xml.linq.xnamespace.aspx"&gt;XNamepace&lt;/a&gt; has an implicit conversion from string, and redefines the + operator to 
    combine itself with a string to form a full &lt;a href="http://msdn2.microsoft.com/en-us/library/system.xml.linq.xname.aspx"&gt;XName&lt;/a&gt; (which also has an implicit string conversion operator). 
&lt;/p&gt;&lt;p&gt;Someone spent some time designing this API for users instead of for a standards body, and it's much appreciated. &lt;/p&gt;&lt;img src="http://odetocode.com/Blogs/aggbug.aspx?PostID=12047" width="1" height="1"&gt;</description></item><item><title>Mocks - It's A Question Of When</title><link>http://odetocode.com/Blogs/scott/archive/2008/05/01/12044.aspx</link><pubDate>Fri, 02 May 2008 06:47:00 GMT</pubDate><guid isPermaLink="false">2a1db9d5-42e2-4e6d-a60a-04dde226509f:12044</guid><dc:creator>scott</dc:creator><slash:comments>2</slash:comments><comments>http://odetocode.com/Blogs/scott/comments/12044.aspx</comments><wfw:commentRss>http://odetocode.com/Blogs/scott/commentrss.aspx?PostID=12044</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://codingcockerel.co.uk/"&gt;Ross Neilson&lt;/a&gt; reminded me about a question I left hanging - "when should I use a mock object framework?"
&lt;/p&gt;&lt;p&gt;If you have to ask "when", the answer is probably "not now". I feel that mock object frameworks are something you have to evolve into.  
&lt;/p&gt;&lt;p&gt;First, we can talk about mocks in general. Some people have a misconception that mock objects are &lt;em&gt;only&lt;/em&gt; useful if you need to simulate interaction with a resource that is difficult to use in unit tests - like an object that communicates with an SMTP server. This isn't true. &lt;a href="http://www.colinmackay.net/tabid/159/Default.aspx"&gt;Colin Mackay has an article on mocks&lt;/a&gt; that outlines other common scenarios:
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The real object has nondeterministic behavior
&lt;/li&gt;&lt;li&gt;The real object is difficult to setup
&lt;/li&gt;&lt;li&gt;The real object has behavior that is hard to trigger
&lt;/li&gt;&lt;li&gt;The real object is slow
&lt;/li&gt;&lt;li&gt;The real object is a user interface
&lt;/li&gt;&lt;li&gt;The real object uses a call back
&lt;/li&gt;&lt;li&gt;The real object does not yet exist
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If we were to step back and generalize this list, we'd say &lt;a href="http://www.martinfowler.com/bliki/TestDouble.html"&gt;test doubles&lt;/a&gt; are useful when you want to &lt;em&gt;isolate code under test&lt;/em&gt;. Isolation is good. Let's say we are writing tests for a business component. We wouldn't want the tests to fail when someone checked in bad code for an auditing service the business component uses. We only want the test to fail when something is wrong with the business component itself. Providing a mock auditing service allows us to isolate the business component &lt;em&gt;and&lt;/em&gt; control any stimuli the component may pick up from its auditing service. When you start feeling the pain of writing numerous test doubles by hand, you'll know you need a mock object framework. 
&lt;/p&gt;&lt;p&gt;Mocks aren't just about isolation, however. Mocks are also play a role in test driven development, which is what Colin's last bullet point alludes. The authors of "&lt;a href="http://www.mockobjects.com/files/mockrolesnotobjects.pdf"&gt;Mock Roles, Not Objects&lt;/a&gt;" say that mocks are:
&lt;/p&gt;&lt;p style="margin-left: 36pt;"&gt; "… a technique for identifying types in a system based on the roles that objects play … In particular, we now understand that the most important benefit of Mock Objects is what we originally called interface discovery". 
&lt;/p&gt;&lt;p&gt;Using a mock object framework alongside TDD allows a continuous, top-down design of software. Many TDD fans know they need a mock object framework from day one. 
&lt;/p&gt;&lt;h3&gt;But Aren't Mock Object Frameworks Complex?
&lt;/h3&gt;&lt;p&gt;This is another question I've been asked recently. Mock object frameworks are actually rather simple and expose a small API. There is complexity, though, just not in the framework itself. As I said earlier, I think there is a path you can follow where you evolve into using mock object frameworks. The typical project team using a mock object framework is experienced with TDD and inversion of control containers. Trying to get up to speed on all these topics at once can be overwhelming.  
&lt;/p&gt;&lt;p&gt;There is also some complexity in using mocks effectively. In &lt;a href="Mocks%20and%20the%20Dangers%20of%20Overspecified%20Software"&gt;Mocks and the Dangers of Overspecified Software&lt;/a&gt;, Ian Cooper says:
&lt;/p&gt;&lt;p&gt;"When you change the implementation of a method under test, mocks can break because you now make additional or different calls to the dependent component that is being mocked. … The mocks began to make our software more resistant to change, more sluggish, and this increased the cost to refactoring. As change becomes more expensive, we risked becoming resistant to making it, and we risk starting to build technical debt. A couple of times the tests broke, as developers changed the domain, or changed how we were doing persistence, without changing the test first, because they were frustrated at how it slowed their development. The mocks became an impedance to progress."
&lt;/p&gt;&lt;p&gt;Mock object frameworks make interaction based testing easy, but can also lead to the problems Ian outlines. Here a couple more reads on this topic:
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.ayende.com/Blog/archive/2007/04/05/Guidelines-to-using-Interaction-Based-Testing.aspx"&gt;Guidelines to Using Interaction Based Testing&lt;/a&gt;
		&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;a href="http://serialseb.blogspot.com/2007/12/why-mock-frameworks-suck-and-how-to.html"&gt;Why Mock Frameworks Suck&lt;/a&gt;
			&lt;/div&gt;&lt;p&gt;
 &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In summary – mock object frameworks aren't for everyone. You'll know when you need one!&lt;/p&gt;&lt;img src="http://odetocode.com/Blogs/aggbug.aspx?PostID=12044" width="1" height="1"&gt;</description></item><item><title>Microsoft versus Open Source Software - ALT.NET notes</title><link>http://odetocode.com/Blogs/scott/archive/2008/04/22/12027.aspx</link><pubDate>Tue, 22 Apr 2008 13:33:00 GMT</pubDate><guid isPermaLink="false">2a1db9d5-42e2-4e6d-a60a-04dde226509f:12027</guid><dc:creator>scott</dc:creator><slash:comments>7</slash:comments><comments>http://odetocode.com/Blogs/scott/comments/12027.aspx</comments><wfw:commentRss>http://odetocode.com/Blogs/scott/commentrss.aspx?PostID=12027</wfw:commentRss><description>&lt;p&gt;At the Seattle &lt;a href="http://altdotnet.org/events/seattle"&gt;alt.net&lt;/a&gt; conference, I co-sponsored a session with &lt;a href="http://blogs.microsoft.co.il/blogs/justinangel/"&gt;Justin Angel&lt;/a&gt;. The topic was "Choosing Microsoft versus Mature Open Source Alternatives". We wanted to hear the rationale people were using when making choices, like: 
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/bb425822.aspx"&gt;LINQ to SQL&lt;/a&gt; or &lt;a href="http://www.castleproject.org/activerecord/index.html"&gt;Castle Active Record&lt;/a&gt;
	&lt;/p&gt;&lt;p&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/aa697427%28VS.80%29.aspx"&gt;Entity Framework&lt;/a&gt; or &lt;a href="http://www.nhibernate.org/"&gt;NHibernate&lt;/a&gt;
	&lt;/p&gt;&lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; and assorted tools or &lt;a href="http://msdn2.microsoft.com/en-us/teamsystem/aa718934.aspx"&gt;Team Foundation Server&lt;/a&gt;&lt;/blockquote&gt;&lt;p&gt;
	&lt;/p&gt;&lt;p&gt;Not once do I remember price being a factor. Most of the &lt;a href="http://en.wikipedia.org/wiki/Fishbowl_%28conversation%29"&gt;fishbowl&lt;/a&gt; conversation revolved around risk. There are risks that technical people don't like, and risks that business people don't like. I tried to take all the major topics mentioned and fit them into the following table.  
&lt;table&gt;&lt;tr&gt;&lt;td&gt; &lt;br&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Choose Microsoft&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Choose OSS&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Business Risks&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt; &lt;br&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;License issues
&lt;/p&gt;&lt;p&gt;Lack of formal support
&lt;/p&gt;&lt;p&gt;Hard to hire experts&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Technical Risks&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;V1 and V2 won't always work
&lt;/p&gt;&lt;p&gt;Waiting on bug fixes 
&lt;/p&gt;&lt;p&gt;Friction&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Small communities
&lt;/p&gt;&lt;p&gt;Lack of training material&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;Quick summary - Microsoft is a safe choice from the business perspective, but MSFT products can create an uphill struggle for developers. &lt;a href="http://blogs.msdn.com/brada/"&gt;Brad Abrams&lt;/a&gt; and &lt;a href="http://weblogs.asp.net/scottgu/"&gt;ScottGu&lt;/a&gt; both popped into the fishbowl to talk about Microsoft's change of direction in building closed source frameworks with "big bang" releases. ScottGu also reminded us that &lt;a href="http://www.news.com/Rise-of-the-patent-trolls/2010-1071_3-5892996.html"&gt;patent trolls&lt;/a&gt; create problems for everyone in the ecosystem. 
&lt;/p&gt;&lt;p&gt;&lt;strong&gt;ALT.NET Trivia
&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;How much ALT.NET can you fit in a Hyundai?
&lt;/p&gt;&lt;p&gt;According to Hertz, the &lt;a href="http://www.hyundaiusa.com/vehicle/Elantra/Elantra.aspx"&gt;Hyundai Elantra&lt;/a&gt; will accommodate 5 people and 3 pieces of luggage. 
&lt;/p&gt;&lt;p&gt;The Elantra I drove into Redmond accommodated 5 people (me, &lt;a href="http://codebetter.com/blogs/jeremy.miller/"&gt;Jeremy Miller&lt;/a&gt;, &lt;a href="http://udidahan.weblogs.us/"&gt;Udi Dahan&lt;/a&gt;, &lt;a href="http://stevenharman.net/"&gt;Steven "I Love The Back Middle Seat" Harman&lt;/a&gt;, and &lt;a href="http://www.ayende.com/Blog/"&gt;Ayende&lt;/a&gt;), &lt;b&gt;6&lt;/b&gt; pieces of luggage, and 3, maybe 4 laptop bags. It was tight.&amp;nbsp; 
&lt;/p&gt;&lt;p&gt;Who said developers can't optimize for space anymore?
&lt;/p&gt;&lt;img src="http://odetocode.com/Blogs/aggbug.aspx?PostID=12027" width="1" height="1"&gt;</description></item><item><title>A Gentle Introduction to Mocking</title><link>http://odetocode.com/Blogs/scott/archive/2008/04/17/12013.aspx</link><pubDate>Fri, 18 Apr 2008 02:19:00 GMT</pubDate><guid isPermaLink="false">2a1db9d5-42e2-4e6d-a60a-04dde226509f:12013</guid><dc:creator>scott</dc:creator><slash:comments>4</slash:comments><comments>http://odetocode.com/Blogs/scott/comments/12013.aspx</comments><wfw:commentRss>http://odetocode.com/Blogs/scott/commentrss.aspx?PostID=12013</wfw:commentRss><description>&lt;p&gt;At the last CMAP Code Camp I did a "code-only" presentation entitled "A Gentle Introduction to Mocking". We wrote down some requirements, opened Visual Studio, and started writing unit tests. &lt;a href="http://weblogs.asp.net/Podwysocki"&gt;Matt Podwysocki&lt;/a&gt; provided color commentary. Code download is here.  
&lt;/p&gt;&lt;p&gt;I started "accepting" mock objects as one tool in my unit testing toolbox about three years ago (see "&lt;a href="http://odetocode.com/Blogs/scott/archive/2005/02/16/1023.aspx"&gt;The 5 Stages Of Mocking&lt;/a&gt;"). Times have changed quite a bit since then, and the tools have improved dramatically. During the presentation we used the following:
&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.ayende.com/projects/rhino-mocks/downloads.aspx"&gt;Rhino Mocks&lt;/a&gt; – the first mocking framework used in the presentation. Years ago, &lt;a href="http://www.ayende.com/Blog/"&gt;Oren&lt;/a&gt; and Rhino Mocks saved us from "string based" mock objects. Rhino Mocks can easily conjure up a strongly typed mock object. The strong typing results in fewer errors, and greatly enhances the refactoring experience. 
&lt;/p&gt;&lt;p&gt;&lt;a href="http://code.google.com/p/moq/"&gt;moq&lt;/a&gt; – is the latest mocking framework in the .NET space and is authored by &lt;a href="http://www.clariusconsulting.net/blogs/kzu/"&gt;kzu&lt;/a&gt; and friends. moq uses lambda expressions and expression trees to define mock object behavior, and also provides strongly typed mocks. The recent &lt;a href="http://www.clariusconsulting.net/blogs/kzu/archive/2007/12/26/48177.aspx"&gt;addition&lt;/a&gt; of factories and mock verification means you can do traditional interaction style testing with moq, if &lt;a href="http://martinfowler.com/articles/mocksArentStubs.html"&gt;that&lt;/a&gt; is the &lt;a href="http://codebetter.com/blogs/jeremy.miller/pages/129544.aspx"&gt;path&lt;/a&gt; you &lt;a href="http://www.clariusconsulting.net/blogs/kzu/archive/2007/12/21/StateTestingvsInteractionTesting.aspx"&gt;choose&lt;/a&gt;. The primary differentiator between the two frameworks is that moq does not use a record / playback paradigm. 
&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;Here is a test we wrote with Rhino Mocks:
&lt;/p&gt;
&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
[&lt;span style="color: rgb(43, 145, 175);"&gt;Fact&lt;/span&gt;&lt;span style="color: black;"&gt;] &lt;br&gt;
&lt;/span&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;void&lt;/span&gt;&lt;span style="color: black;"&gt; Does_Not_Make_Deposit_When_Verification_Fails()&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;MockRepository&lt;/span&gt;&lt;span style="color: black;"&gt; mocks = &lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;MockRepository&lt;/span&gt;&lt;span style="color: black;"&gt;();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IAuditService&lt;/span&gt;&lt;span style="color: black;"&gt; auditService = mocks.DynamicMock&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IAuditService&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IVerificationService&lt;/span&gt;&lt;span style="color: black;"&gt; verificationService = mocks.CreateMock&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IVerificationService&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;();&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;decimal&lt;/span&gt;&lt;span style="color: black;"&gt; amount = 1000;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;BankAccount&lt;/span&gt;&lt;span style="color: black;"&gt; account = &lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;BankAccount&lt;/span&gt;&lt;span style="color: black;"&gt;(auditService,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;verificationService);&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;using&lt;/span&gt;&lt;span style="color: black;"&gt; (mocks.Record())&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Expect&lt;/span&gt;&lt;span style="color: black;"&gt;.Call(verificationService.VerifyDeposit(account, amount))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Return(&lt;/span&gt;&lt;span style="color: Blue;"&gt;false&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;using&lt;/span&gt;&lt;span style="color: black;"&gt; (mocks.Playback())&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;account.Deposit(amount);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;account.Balance.ShouldEqual(0);&lt;br&gt;
&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;The same test using moq:
&lt;/p&gt;
&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
[&lt;span style="color: rgb(43, 145, 175);"&gt;Fact&lt;/span&gt;&lt;span style="color: black;"&gt;]&lt;br&gt;
&lt;/span&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;void&lt;/span&gt;&lt;span style="color: black;"&gt; Does_Not_Make_Deposit_When_Verification_Fails()&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Mock&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IAuditService&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt; _auditMock = &lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Mock&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IAuditService&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Mock&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IVerificationService&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt; _verificationMock = &lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Mock&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IVerificationService&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;();&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;decimal&lt;/span&gt;&lt;span style="color: black;"&gt; amount = 1000;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;BankAccount&lt;/span&gt;&lt;span style="color: black;"&gt; account = &lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;BankAccount&lt;/span&gt;&lt;span style="color: black;"&gt;(_auditMock.Object, _verificationMock.Object);&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_auditMock.Expect(a =&amp;gt; a.WriteMessage(&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;It&lt;/span&gt;&lt;span style="color: black;"&gt;.IsAny&amp;lt;&lt;/span&gt;&lt;span style="color: Blue;"&gt;string&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;()));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_verificationMock.Expect(v =&amp;gt; v.VerifyDeposit(account, amount))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Returns(&lt;/span&gt;&lt;span style="color: Blue;"&gt;false&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;account.Deposit(amount);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;account.Balance.ShouldEqual(0);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/div&gt;	
&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.codeplex.com/xunit"&gt;xUnit.net&lt;/a&gt; – although not featured in the presentation, xUnit.net drove all the unit tests. xUnit is a new framework authored by &lt;a href="http://blogs.msdn.com/jamesnewkirk/"&gt;Jim Newkirk&lt;/a&gt; and &lt;a href="http://bradwilson.typepad.com/"&gt;Brad Wilson&lt;/a&gt;. The framework &lt;a href="http://www.codeplex.com/xunit/Wiki/View.aspx?title=WhyDidWeBuildXunit&amp;amp;referringTitle=Home"&gt;codifies &lt;/a&gt;some unit testing best practices and takes advantage of new features in the C# language and .NET framework. I like it. 
&lt;/p&gt;&lt;p&gt;One question that came up a few times was "when should I use a mock object framework"? Turns out I've been asked a lot of questions starting with &lt;em&gt;when&lt;/em&gt; lately, so I'll answer that question in the next post. 
&lt;/p&gt;&lt;img src="http://odetocode.com/Blogs/aggbug.aspx?PostID=12013" width="1" height="1"&gt;</description></item><item><title>Following Principles</title><link>http://odetocode.com/Blogs/scott/archive/2008/04/09/11976.aspx</link><pubDate>Wed, 09 Apr 2008 08:02:00 GMT</pubDate><guid isPermaLink="false">2a1db9d5-42e2-4e6d-a60a-04dde226509f:11976</guid><dc:creator>scott</dc:creator><slash:comments>5</slash:comments><comments>http://odetocode.com/Blogs/scott/comments/11976.aspx</comments><wfw:commentRss>http://odetocode.com/Blogs/scott/commentrss.aspx?PostID=11976</wfw:commentRss><description>&lt;p&gt;A dictionary &lt;a href="http://wordnet.princeton.edu/perl/webwn?s=principle"&gt;definition&lt;/a&gt; of principle often uses the word "law", but principles in software development still require judgment. Sometimes the judgment requires some technical knowledge, like knowing the strengths and weaknesses of a particular technology. Other times the judgment requires some business knowledge, like the ability to anticipate where change is likely to occur. 
&lt;/p&gt;&lt;p&gt;Asking someone to make a sensible judgment about a principle is difficult when all you see is a snippet of code in a blog. The code is outside of its context. Take Leroy's &lt;a href="http://odetocode.com/Blogs/scott/archive/2008/03/30/11935.aspx"&gt;BankAccount&lt;/a&gt; class. We don't really know what sort of business Leroy works for, or even what type of software Leroy is building. Nevertheless, let's apply a few principles to see what's bothering Leroy. 
&lt;/p&gt;&lt;h3&gt;Remaining Single
&lt;/h3&gt;&lt;p&gt;Does Leroy's original BankAccount class violate the &lt;a href="http://c2.com/cgi/wiki?SingleResponsibilityPrinciple"&gt;Single Responsibility Principle&lt;/a&gt;? I think so. The class is opening text files for logging, calculating interest, and oh, by the way, it needs to provide all the state and behavior for a financial account, too. Even without knowing the context, it seems reasonable to remove the auditing cruft into a separate class. After &lt;a href="http://feeds.feedburner.com/%7Er/flux88/%7E3/266731731/TheImportanceOfWritingTheTestFirst.aspx"&gt;writing some tests&lt;/a&gt;, and implementing a concrete auditing class, Leroy's BankAccount might look like the following. 
&lt;/p&gt;
&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;BankAccount&lt;br&gt;
&lt;/span&gt;&lt;span style="color: black;"&gt;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;void&lt;/span&gt;&lt;span style="color: black;"&gt; Deposit(&lt;/span&gt;&lt;span style="color: Blue;"&gt;decimal&lt;/span&gt;&lt;span style="color: black;"&gt; amount)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Balance += amount;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_log.Write(&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"Deposited {0} on {1}"&lt;/span&gt;&lt;span style="color: black;"&gt;, amount, &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;DateTime&lt;/span&gt;&lt;span style="color: black;"&gt;.Now);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: Green;"&gt;// ...&lt;br&gt;
&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp; &lt;br&gt;
&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;AuditLog&lt;/span&gt;&lt;span style="color: black;"&gt; _log = &lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;AuditLog&lt;/span&gt;&lt;span style="color: black;"&gt;();&lt;br&gt;
&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;Leroy has an almost infinite number of choices to make before coming up with the above implementation, though. Leroy could have derived BankAccount from an Auditable base class, or forced BankAccount to implement an IAuditable interface. But what guides Leroy to this particular solution in the universe of a million possibilities are other &lt;a href="http://c2.com/cgi/wiki?PrinciplesOfObjectOrientedDesign"&gt;principles&lt;/a&gt; - like the &lt;a href="http://c2.com/cgi/wiki?InterfaceSegregationPrinciple"&gt;Interface Segregation Principle&lt;/a&gt;, and &lt;a href="http://c2.com/cgi/wiki?CompositionInsteadOfInheritance"&gt;Composition Over Inheritance&lt;/a&gt;. 
&lt;/p&gt;&lt;h3&gt;An Addiction to Auditing
&lt;/h3&gt;&lt;p&gt;Leroy might still frown at his class, feeling he has violated the &lt;a href="http://c2.com/cgi/wiki?DependencyInversionPrinciple"&gt;Dependency Inversion Principle&lt;/a&gt;. Without any additional information, we have to trust Leroy's judgment when he decides to make some additional changes. 
&lt;/p&gt;
&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;BankAccount&lt;br&gt;
&lt;/span&gt;&lt;span style="color: black;"&gt;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; BankAccount (&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IAuditLog&lt;/span&gt;&lt;span style="color: black;"&gt; auditLog)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_log = auditLog;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;void&lt;/span&gt;&lt;span style="color: black;"&gt; Deposit(&lt;/span&gt;&lt;span style="color: Blue;"&gt;decimal&lt;/span&gt;&lt;span style="color: black;"&gt; amount)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Balance += amount;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_log.Write(&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"Deposited {0} on {1}"&lt;/span&gt;&lt;span style="color: black;"&gt;, amount, &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;DateTime&lt;/span&gt;&lt;span style="color: black;"&gt;.Now);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: Green;"&gt;// ...&lt;br&gt;
&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp; &lt;br&gt;
&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IAuditLog&lt;/span&gt;&lt;span style="color: black;"&gt; _log;&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;Perhaps Leroy already knew about some future changes in his auditing implementation, or perhaps Leroy just wanted to make his class more testable. Some of us view software as a massive heap of dependencies, and we fight to reduce the brittleness created by dependencies using &lt;a href="http://msdn2.microsoft.com/en-us/magazine/cc337885.aspx"&gt;inversion of control and dependency injection&lt;/a&gt; techniques. In some environments, this isn't needed. The principles to apply depend on the language you use, the tools you use, and ultimately depend on the problem the software is trying to solve. 
&lt;/p&gt;&lt;h3&gt; Is There Still Something Wrong With This Code? 
&lt;/h3&gt;&lt;p&gt;WWWTC has had a run of &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=what%27s+wrong+with+this+code+site%3Aodetocode.com"&gt;19 episodes&lt;/a&gt;. I have some material for at least another 20. Problem is, most of the material deals with API trivia and edge cases you might never see. Interesting? To me, at least, but I'm thinking of introducing more squishy design type entries. I know a lot of people struggle to apply the latest frameworks and libraries, but design questions are always enlightening and produce the most spirited debate, giving us all something we can learn from.   
&lt;/p&gt;&lt;img src="http://odetocode.com/Blogs/aggbug.aspx?PostID=11976" width="1" height="1"&gt;</description></item><item><title>Testing Old Code Is Hard</title><link>http://odetocode.com/Blogs/scott/archive/2008/04/01/11962.aspx</link><pubDate>Wed, 02 Apr 2008 06:54:00 GMT</pubDate><guid isPermaLink="false">2a1db9d5-42e2-4e6d-a60a-04dde226509f:11962</guid><dc:creator>scott</dc:creator><slash:comments>2</slash:comments><comments>http://odetocode.com/Blogs/scott/comments/11962.aspx</comments><wfw:commentRss>http://odetocode.com/Blogs/scott/commentrss.aspx?PostID=11962</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://odetocode.com/Blogs/scott/archive/2008/03/30/11935.aspx"&gt;&lt;em&gt;WWWTC #19&lt;/em&gt;&lt;/a&gt;&lt;em&gt; presented a BankAccount class from a developer named Leroy and garnered some great feedback. A couple people spotted an actual bug in the interest calculation, which was unintentional. If only Leroy had written some tests for the code…
&lt;/em&gt;&lt;/p&gt;&lt;p&gt;"Gee, if only I'd written some tests for this code", thought Leroy. Back when Leroy first wrote the code, he considered testing as a job for those irritating people on the other side of the office building. Now, Leroy was looking at changing the BankAccount class to add new features. He was wishing he'd discovered the joys of unit tests earlier than he did. He'd be able to review the existing tests and understand the behavior of the class in more detail, plus, he'd be able to make changes to the class and know immediately if he was breaking any functionality. 
&lt;/p&gt;&lt;p&gt;"Better late than never", Leroy thought. Writing tests at this point would give him a better understanding of the class and offer the safety net he needed for the upcoming changes. Leroy created a new class library with references to some &lt;a href="http://www.codeplex.com/xunit"&gt;xUnit&lt;/a&gt; assemblies and started in. After a bit of test running, he reached this point:
&lt;/p&gt;
&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
        &lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;
            class&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;BankAccountTests&lt;br&gt;
            &lt;/span&gt;&lt;span style="color: black;"&gt;{&lt;br&gt;
                &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Fact&lt;/span&gt;&lt;span style="color: black;"&gt;]&lt;br&gt;
                    &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt;
                    &lt;/span&gt;&lt;span style="color: Blue;"&gt;void&lt;/span&gt;&lt;span style="color: black;"&gt; BalanceShouldEqualFirstDeposit()&lt;br&gt;
                        &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
                        &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;decimal&lt;/span&gt;&lt;span style="color: black;"&gt; amount = 200.00m;&lt;br&gt;
                            &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;BankAccount&lt;/span&gt;&lt;span style="color: black;"&gt; account = &lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;BankAccount&lt;/span&gt;&lt;span style="color: black;"&gt;();&lt;br&gt;
                                        &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;account.Deposit(amount);&lt;br&gt;
                                        &lt;br&gt;
                                        &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;account.Balance.ShouldEqual(amount);&lt;br&gt;
                                        &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
                                        &lt;br&gt;
                                        &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Green;"&gt;// ...&lt;br&gt;
                                            &lt;br&gt;
                                        &lt;/span&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Fact&lt;/span&gt;&lt;span style="color: black;"&gt;]&lt;br&gt;
                                            &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt;
                                            &lt;/span&gt;&lt;span style="color: Blue;"&gt;void&lt;/span&gt;&lt;span style="color: black;"&gt; DepositShouldCreateLogEntry()&lt;br&gt;
                                                &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
                                                &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Green;"&gt;//
                                                    ...&lt;br&gt;
                                                &lt;/span&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
                                                    }&lt;br&gt;
                                                &lt;/span&gt;
    &lt;/div&gt;
&lt;p&gt;"Hmm – verifying the log entry is tricky", Leroy thought to himself. "It's too bad this BankAccount class is responsible for formatting and writing the log entry &lt;font size="4"&gt;&lt;strong&gt;&lt;em&gt;and&lt;/em&gt;&lt;/strong&gt;&lt;/font&gt; all that banking logic. Maybe I should do something about that…"
&lt;/p&gt;&lt;p&gt;&lt;em&gt;To be continued… 
&lt;/em&gt;&lt;/p&gt;&lt;p&gt; 
 &lt;/p&gt;&lt;img src="http://odetocode.com/Blogs/aggbug.aspx?PostID=11962" width="1" height="1"&gt;</description></item><item><title>What's Wrong With This Code (#19)</title><link>http://odetocode.com/Blogs/scott/archive/2008/03/30/11935.aspx</link><pubDate>Mon, 31 Mar 2008 06:55:00 GMT</pubDate><guid isPermaLink="false">2a1db9d5-42e2-4e6d-a60a-04dde226509f:11935</guid><dc:creator>scott</dc:creator><slash:comments>32</slash:comments><comments>http://odetocode.com/Blogs/scott/comments/11935.aspx</comments><wfw:commentRss>http://odetocode.com/Blogs/scott/commentrss.aspx?PostID=11935</wfw:commentRss><description>&lt;p&gt;Leroy was shocked when the source code appeared. It was familiar yet strange, like an old lover's kiss. The code was five years old – an artifact of Leroy's first project. Leroy slowly scrolled through the code and pondered his next move. It wasn't a bug that was bothering Leroy – there were no race conditions or tricky numerical conversions. No performance problems or uncaught error conditions. It was all about design …
&lt;/p&gt;

&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;BankAccount&lt;br&gt;
&lt;/span&gt;&lt;span style="color: black;"&gt;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;void&lt;/span&gt;&lt;span style="color: black;"&gt; Deposit(&lt;/span&gt;&lt;span style="color: Blue;"&gt;decimal&lt;/span&gt;&lt;span style="color: black;"&gt; amount)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_balance += amount;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LogTransaction(&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"Deposited {0} on {1}"&lt;/span&gt;&lt;span style="color: black;"&gt;, amount, &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;DateTime&lt;/span&gt;&lt;span style="color: black;"&gt;.Now);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;void&lt;/span&gt;&lt;span style="color: black;"&gt; Withdraw(&lt;/span&gt;&lt;span style="color: Blue;"&gt;decimal&lt;/span&gt;&lt;span style="color: black;"&gt; amount)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_balance -= amount;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LogTransaction(&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"Withdrew {0} on {1}"&lt;/span&gt;&lt;span style="color: black;"&gt;, amount, &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;DateTime&lt;/span&gt;&lt;span style="color: black;"&gt;.Now);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;void&lt;/span&gt;&lt;span style="color: black;"&gt; AccumulateInterest(&lt;/span&gt;&lt;span style="color: Blue;"&gt;decimal&lt;/span&gt;&lt;span style="color: black;"&gt; baseRate)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;decimal&lt;/span&gt;&lt;span style="color: black;"&gt; interest;&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;if&lt;/span&gt;&lt;span style="color: black;"&gt; (_balance &amp;lt; 10000)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;interest = _balance * baseRate;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;else&lt;br&gt;
&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;interest = _balance * (baseRate + 0.01);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LogTransaction(&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"Accumulated {0} interest on {1}"&lt;/span&gt;&lt;span style="color: black;"&gt;, interest, &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;DateTime&lt;/span&gt;&lt;span style="color: black;"&gt;.Now);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;void&lt;/span&gt;&lt;span style="color: black;"&gt; LogTransaction(&lt;/span&gt;&lt;span style="color: Blue;"&gt;string&lt;/span&gt;&lt;span style="color: black;"&gt; message, &lt;/span&gt;&lt;span style="color: Blue;"&gt;params&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;object&lt;/span&gt;&lt;span style="color: black;"&gt;[] parameters)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;using&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;FileStream&lt;/span&gt;&lt;span style="color: black;"&gt; fs = &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;File&lt;/span&gt;&lt;span style="color: black;"&gt;.Open(&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"auditlog.txt"&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;FileMode&lt;/span&gt;&lt;span style="color: black;"&gt;.OpenOrCreate))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;using&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;StreamWriter&lt;/span&gt;&lt;span style="color: black;"&gt; writer = &lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;StreamWriter&lt;/span&gt;&lt;span style="color: black;"&gt;(fs))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.WriteLine(message, parameters);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;decimal&lt;/span&gt;&lt;span style="color: black;"&gt; Balance&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;get&lt;/span&gt;&lt;span style="color: black;"&gt; { &lt;/span&gt;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&lt;span style="color: black;"&gt; _balance; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;set&lt;/span&gt;&lt;span style="color: black;"&gt; { _balance = &lt;/span&gt;&lt;span style="color: Blue;"&gt;value&lt;/span&gt;&lt;span style="color: black;"&gt;; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;decimal&lt;/span&gt;&lt;span style="color: black;"&gt; _balance;&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;"Times have changed, and so I have, fortunately", Leroy thought to himself. "And so will this code…"
&lt;/p&gt;&lt;p&gt;&lt;em&gt;To be continued…&lt;/em&gt;&lt;/p&gt;&lt;img src="http://odetocode.com/Blogs/aggbug.aspx?PostID=11935" width="1" height="1"&gt;</description></item><item><title>Custom Aggregations In LINQ</title><link>http://odetocode.com/Blogs/scott/archive/2008/03/29/11931.aspx</link><pubDate>Sat, 29 Mar 2008 21:50:00 GMT</pubDate><guid isPermaLink="false">2a1db9d5-42e2-4e6d-a60a-04dde226509f:11931</guid><dc:creator>scott</dc:creator><slash:comments>6</slash:comments><comments>http://odetocode.com/Blogs/scott/comments/11931.aspx</comments><wfw:commentRss>http://odetocode.com/Blogs/scott/commentrss.aspx?PostID=11931</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/bb548651.aspx"&gt;Aggregate&lt;/a&gt; is a standard LINQ operator for in-memory collections that allows us to build a custom aggregation. Although LINQ provides a few standard aggregation operators, like Count, Min, Max, and Average, if you want an inline implementation of, say, a standard deviation calculation, then the Aggregate extension method is one approach you can use (the other approach being that you could write your own operator). 
&lt;/p&gt;&lt;p&gt;Let's say we wanted to see the total number of threads running on a machine. We could get that number lambda style, or with a query comprehension, or with a custom aggregate. 
&lt;/p&gt;
&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
&lt;span style="color: Blue;"&gt;var&lt;/span&gt;&lt;span style="color: black;"&gt; processes = &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Process&lt;/span&gt;&lt;span style="color: black;"&gt;.GetProcesses();&lt;br&gt;
&lt;br&gt;
&lt;/span&gt;&lt;span style="color: Blue;"&gt;int&lt;/span&gt;&lt;span style="color: black;"&gt; totalThreads = 0;&lt;br&gt;
&lt;br&gt;
&lt;/span&gt;&lt;span style="color: black;"&gt; totalThreads = processes.Sum(p =&amp;gt; p.Threads.Count);&lt;br&gt;
&lt;br&gt;
totalThreads = (&lt;/span&gt;&lt;span style="color: Blue;"&gt;from&lt;/span&gt;&lt;span style="color: black;"&gt; process &lt;/span&gt;&lt;span style="color: Blue;"&gt;in&lt;/span&gt;&lt;span style="color: black;"&gt; processes&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;select&lt;/span&gt;&lt;span style="color: black;"&gt; process.Threads.Count).Sum();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&lt;br&gt;
totalThreads =&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; processes.Aggregate(&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Green;"&gt;// initialize&lt;br&gt;
&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(acc, p) =&amp;gt; acc += p.Threads.Count, &lt;/span&gt;&lt;span style="color: Green;"&gt;// 
    accumulate&lt;br&gt;
&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;acc =&amp;gt; acc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Green;"&gt;// terminate&lt;br&gt;
&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;br&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;This particular overloaded version of Aggregate follows a common pattern of "Initialize – Accumulate – Terminate". You can see this pattern in extensible aggregation strategies from &lt;a href="http://www.oracle.com/technology/oramag/oracle/06-jul/o46sql.html"&gt;Oracle&lt;/a&gt; to &lt;a href="http://technet.microsoft.com/en-us/library/ms131056.aspx"&gt;SQLCLR&lt;/a&gt;. The first parameter represents an initialization expression. We need to provide an initialized accumulator – in this case just an integer value of 0. 
&lt;/p&gt;&lt;p&gt;The second parameter is a Func&amp;lt;int, Process, int&amp;gt; expression that the aggregate method will invoke as it iterates across the sequence of inputs. For each process we get our accumulator value (an int), and a reference to the current process in the iteration stage (a Process), and we return a new accumulator value (an int).
&lt;/p&gt;&lt;p&gt;The last parameter is the terminate expression. This is an opportunity to provide any final calculations. For our summation, we just need to return the value in the accumulator. 
&lt;/p&gt;&lt;h1&gt;StdDev 
&lt;/h1&gt;&lt;p&gt;Now, let's compute a more thorough summary of running threads, including a standard deviation. Although we could get away with a simple double accumulator for stddev, we can also use a more sophisticated accumulator to encapsulate some calculations, facilitate unit tests, and make the syntax easier on the eye. 
&lt;/p&gt;
&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
&lt;span style="color: Blue;"&gt;class&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;StdDevAccumulator&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;TSource&amp;gt;&lt;br&gt;
{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; StdDevAccumulator(&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;TSource&amp;gt; source, &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Func&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;TSource, &lt;/span&gt;&lt;span style="color: Blue;"&gt;double&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt; avgSelector)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SampleAvg = source.Average(avgSelector);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SampleCount = source.Count();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;StdDevAccumulator&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;TSource&amp;gt; Accumulate(&lt;/span&gt;&lt;span style="color: Blue;"&gt;double&lt;/span&gt;&lt;span style="color: black;"&gt; value)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TotalDeviation += &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Math&lt;/span&gt;&lt;span style="color: black;"&gt;.Pow(value - SampleAvg, 2.0);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;double&lt;/span&gt;&lt;span style="color: black;"&gt; 
    ComputeResult()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;if&lt;/span&gt;&lt;span style="color: black;"&gt; (SampleCount &amp;lt; 2)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&lt;span style="color: black;"&gt; 0.0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;return&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Math&lt;/span&gt;&lt;span style="color: black;"&gt;.Sqrt(TotalDeviation / (SampleCount - 1));&amp;nbsp;&amp;nbsp; &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;double&lt;/span&gt;&lt;span style="color: black;"&gt; SampleAvg { &lt;/span&gt;&lt;span style="color: Blue;"&gt;get&lt;/span&gt;&lt;span style="color: black;"&gt;; &lt;/span&gt;&lt;span style="color: Blue;"&gt;set&lt;/span&gt;&lt;span style="color: black;"&gt;; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;int&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SampleCount { &lt;/span&gt;&lt;span style="color: Blue;"&gt;get&lt;/span&gt;&lt;span style="color: black;"&gt;; &lt;/span&gt;&lt;span style="color: Blue;"&gt;set&lt;/span&gt;&lt;span style="color: black;"&gt;; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;double&lt;/span&gt;&lt;span style="color: black;"&gt; TotalDeviation { &lt;/span&gt;&lt;span style="color: Blue;"&gt;get&lt;/span&gt;&lt;span style="color: black;"&gt;; &lt;/span&gt;&lt;span style="color: Blue;"&gt;set&lt;/span&gt;&lt;span style="color: black;"&gt;; }&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;Put the accumulator to use like so:
&lt;/p&gt;
&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
&lt;span style="color: Blue;"&gt;var&lt;/span&gt;&lt;span style="color: black;"&gt; processes = &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Process&lt;/span&gt;&lt;span style="color: black;"&gt;.GetProcesses();&lt;br&gt;
&lt;br&gt;
&lt;/span&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt;&lt;span style="color: black;"&gt; summary = &lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;br&gt;
&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TotalProcesses = processes.Count(),&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TotalThreads = processes.Sum(p =&amp;gt; p.Threads.Count),&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MinThreads = processes.Min(p =&amp;gt; p.Threads.Count),&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MaxThreads = processes.Max(p =&amp;gt; p.Threads.Count),&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StdDevThreads = processes.Aggregate(&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;StdDevAccumulator&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Process&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;(processes, p =&amp;gt; p.Threads.Count),&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(acc, p) =&amp;gt; acc.Accumulate(p.Threads.Count),&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(acc)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;gt; acc.ComputeResult()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br&gt;
&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt; 
 &lt;/p&gt;&lt;img src="http://odetocode.com/Blogs/aggbug.aspx?PostID=11931" width="1" height="1"&gt;</description></item><item><title>And Equality for All ... Anonymous Types</title><link>http://odetocode.com/Blogs/scott/archive/2008/03/25/11916.aspx</link><pubDate>Wed, 26 Mar 2008 05:21:00 GMT</pubDate><guid isPermaLink="false">2a1db9d5-42e2-4e6d-a60a-04dde226509f:11916</guid><dc:creator>scott</dc:creator><slash:comments>1</slash:comments><comments>http://odetocode.com/Blogs/scott/comments/11916.aspx</comments><wfw:commentRss>http://odetocode.com/Blogs/scott/commentrss.aspx?PostID=11916</wfw:commentRss><description>&lt;p&gt;Given this simple Employee class:
&lt;/p&gt;
&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;class&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Employee&lt;br&gt;
&lt;/span&gt;&lt;span style="color: black;"&gt;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;int&lt;/span&gt;&lt;span style="color: black;"&gt; ID { &lt;/span&gt;&lt;span style="color: Blue;"&gt;get&lt;/span&gt;&lt;span style="color: black;"&gt;; &lt;/span&gt;&lt;span style="color: Blue;"&gt;set&lt;/span&gt;&lt;span style="color: black;"&gt;; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;string&lt;/span&gt;&lt;span style="color: black;"&gt; Name { &lt;/span&gt;&lt;span style="color: Blue;"&gt;get&lt;/span&gt;&lt;span style="color: black;"&gt;; &lt;/span&gt;&lt;span style="color: Blue;"&gt;set&lt;/span&gt;&lt;span style="color: black;"&gt;; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
}&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;How many employees do you expect to see from the following query with a &lt;a href="http://msdn2.microsoft.com/en-us/library/system.linq.enumerable.distinct.aspx"&gt;Distinct&lt;/a&gt; operator?
&lt;/p&gt;
&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
&lt;span style="color: Blue;"&gt;var&lt;/span&gt;&lt;span style="color: black;"&gt; employees = &lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;List&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Employee&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Employee&lt;/span&gt;&lt;span style="color: black;"&gt; { ID=1, Name=&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"Barack"&lt;/span&gt;&lt;span style="color: black;"&gt; },&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Employee&lt;/span&gt;&lt;span style="color: black;"&gt; { ID=2, Name=&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"Hillary"&lt;/span&gt;&lt;span style="color: black;"&gt; },&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Employee&lt;/span&gt;&lt;span style="color: black;"&gt; { ID=2, Name=&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"Hillary"&lt;/span&gt;&lt;span style="color: black;"&gt; },&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Employee&lt;/span&gt;&lt;span style="color: black;"&gt; { ID=3, Name=&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"Mac"&lt;/span&gt;&lt;span style="color: black;"&gt; }&lt;br&gt;
};&lt;br&gt;
&lt;br&gt;
&lt;/span&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt;&lt;span style="color: black;"&gt; query =&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: Blue;"&gt;from&lt;/span&gt;&lt;span style="color: black;"&gt; employee &lt;/span&gt;&lt;span style="color: Blue;"&gt;in&lt;/span&gt;&lt;span style="color: black;"&gt; employees&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: Blue;"&gt;select&lt;/span&gt;&lt;span style="color: black;"&gt; employee).Distinct();&lt;br&gt;
&lt;br&gt;
&lt;/span&gt;&lt;span style="color: Blue;"&gt;foreach&lt;/span&gt;&lt;span style="color: black;"&gt; (&lt;/span&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt;&lt;span style="color: black;"&gt; employee &lt;/span&gt;&lt;span style="color: Blue;"&gt;in&lt;/span&gt;&lt;span style="color: black;"&gt; query)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Console&lt;/span&gt;&lt;span style="color: black;"&gt;.WriteLine(employee.Name);&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;The answer is 4 – we'll see both Hillary objects. The docs for Distinct are clear – the method uses the default equality comparer to test for equality, and the default comparer sees 4 distinct &lt;i&gt;object references&lt;/i&gt;. One way to get around this would be to use the overloaded version of Distinct that accepts a custom IEqualityComparer.
&lt;/p&gt;&lt;p&gt;Let's try the query again and project a new, anonymous type with the same properties as Employee.
&lt;/p&gt;
&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
&lt;span style="color: Blue;"&gt;var&lt;/span&gt;&lt;span style="color: black;"&gt; query =&lt;br&gt;
&amp;nbsp;
(&lt;/span&gt;&lt;span style="color: Blue;"&gt;from&lt;/span&gt;&lt;span style="color: black;"&gt; employee &lt;/span&gt;&lt;span style="color: Blue;"&gt;in&lt;/span&gt;&lt;span style="color: black;"&gt; employees&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
 &lt;/span&gt;&lt;span style="color: Blue;"&gt;&amp;nbsp; select&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; { employee.ID, employee.Name }).Distinct();&lt;br&gt;
&lt;/span&gt;
&lt;/div&gt;	
&lt;p&gt;&lt;em&gt;That&lt;/em&gt; query only yields three objects – Distinct removes the duplicate Hillary! How'd it suddenly get so smart?
&lt;/p&gt;&lt;p&gt;Turns out the C# compiler overrides Equals and GetHashCode for anonymous types. The implementation of the two overridden methods uses all the public properties on the type to compute an object's hash code and test for equality. If two objects of the same anonymous type have all the same values for their properties – the objects are equal. This is a safe strategy since anonymously typed objects are essentially immutable (all the properties are read-only). Fiddling with the hash code of a mutable type &lt;a href="http://weblogs.asp.net/bleroy/archive/2004/12/15/316601.aspx"&gt;gets a bit dicey&lt;/a&gt;.  
&lt;/p&gt;&lt;p&gt;Interestingly – I stumbled on the &lt;a href="http://msdn2.microsoft.com/en-us/library/bb384767.aspx"&gt;Visual Basic version of anonymous types&lt;/a&gt; as I was writing this post and I see that VB allows you to define "Key" properties. In VB, only the values of Key properties are compared during an equality test. Key properties are readonly, while non-key properties on an anonymous type are mutable. That's a very C sharpish thing to do, VB team. 
&lt;/p&gt;&lt;img src="http://odetocode.com/Blogs/aggbug.aspx?PostID=11916" width="1" height="1"&gt;</description></item><item><title>Inner, Outer, Let's All Join Together With LINQ</title><link>http://odetocode.com/Blogs/scott/archive/2008/03/24/11907.aspx</link><pubDate>Tue, 25 Mar 2008 06:54:00 GMT</pubDate><guid isPermaLink="false">2a1db9d5-42e2-4e6d-a60a-04dde226509f:11907</guid><dc:creator>scott</dc:creator><slash:comments>9</slash:comments><comments>http://odetocode.com/Blogs/scott/comments/11907.aspx</comments><wfw:commentRss>http://odetocode.com/Blogs/scott/commentrss.aspx?PostID=11907</wfw:commentRss><description>&lt;p&gt;The least intuitive LINQ operators for me are the join operators. After working with healthcare data warehouses for years, I've become accustomed to writing outer joins to circumvent data of the most … suboptimal kind.  Foreign keys? What are those? Alas, I digress…
&lt;/p&gt;&lt;p&gt;At first glance, LINQ appears to only offer a join operator with an 'inner join' behavior. That is, when joining a sequence of departments with a sequence of employees, we will only see those departments that have one or more employees. 
&lt;/p&gt;
&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
&lt;span style="color: Blue;"&gt;var&lt;/span&gt;&lt;span style="color: black;"&gt; query =&lt;br&gt;
&lt;/span&gt;&lt;span style="color: Blue;"&gt;&amp;nbsp; from&lt;/span&gt;&lt;span style="color: black;"&gt; department &lt;/span&gt;&lt;span style="color: Blue;"&gt;in&lt;/span&gt;&lt;span style="color: black;"&gt; departments&lt;br&gt;
&lt;/span&gt;&lt;span style="color: Blue;"&gt;&amp;nbsp; join&lt;/span&gt;&lt;span style="color: black;"&gt; employee &lt;/span&gt;&lt;span style="color: Blue;"&gt;in&lt;/span&gt;&lt;span style="color: black;"&gt; employees&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;on&lt;/span&gt;&lt;span style="color: black;"&gt; department.ID &lt;/span&gt;&lt;span style="color: Blue;"&gt;equals&lt;/span&gt;&lt;span style="color: black;"&gt; employee.DepartmentID &lt;br&gt;
&lt;/span&gt;&lt;span style="color: Blue;"&gt;&amp;nbsp; select&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; { employee.Name, Department = department.Name };&lt;br&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;After a bit more digging, you might come across the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.linq.enumerable.groupjoin.aspx"&gt;GroupJoin&lt;/a&gt; operator. 
    We can use GroupJoin like a SQL left outer join. The "left" side of the join is the outer sequence. If we use departments as the outer sequence in a group join, we can then see the departments with no employees. Note: it is the &lt;em&gt;into&lt;/em&gt; keyword in the next query that triggers the C# compiler to use a GroupJoin instead of a plain &lt;a href="http://msdn2.microsoft.com/en-us/library/system.linq.enumerable.join.aspx"&gt;Join&lt;/a&gt; operator. 
&lt;/p&gt;
&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
&lt;span style="color: Blue;"&gt;var&lt;/span&gt;&lt;span style="color: black;"&gt; query =&lt;br&gt;
&lt;/span&gt;&lt;span style="color: Blue;"&gt;&amp;nbsp; from&lt;/span&gt;&lt;span style="color: black;"&gt; department &lt;/span&gt;&lt;span style="color: Blue;"&gt;in&lt;/span&gt;&lt;span style="color: black;"&gt; departments &lt;br&gt;
&lt;/span&gt;&lt;span style="color: Blue;"&gt;&amp;nbsp; join&lt;/span&gt;&lt;span style="color: black;"&gt; employee &lt;/span&gt;&lt;span style="color: Blue;"&gt;in&lt;/span&gt;&lt;span style="color: black;"&gt; employees &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;on&lt;/span&gt;&lt;span style="color: black;"&gt; department.ID &lt;/span&gt;&lt;span style="color: Blue;"&gt;equals&lt;/span&gt;&lt;span style="color: black;"&gt; employee.DepartmentID&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;&amp;nbsp; into&lt;/span&gt;&lt;span style="color: black;"&gt; 
    employeeGroup &lt;br&gt;
&lt;/span&gt;&lt;span style="color: Blue;"&gt;&amp;nbsp; select&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; 
    { department.Name, Employees = employeeGroup };&lt;br&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;As you might suspect from the syntax, however, the query doesn't give us back a "flat" resultset like a SQL query. Instead, we have a hierarchy to traverse. The projection provides us a department name for each sequence of employees. 
&lt;/p&gt;
&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
&lt;span style="color: Blue;"&gt;foreach&lt;/span&gt;&lt;span style="color: black;"&gt; (&lt;/span&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt;&lt;span style="color: black;"&gt; department &lt;/span&gt;&lt;span style="color: Blue;"&gt;in&lt;/span&gt;&lt;span style="color: black;"&gt; query)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Console&lt;/span&gt;&lt;span style="color: black;"&gt;.WriteLine(&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"{0}"&lt;/span&gt;&lt;span style="color: black;"&gt;, department.Name);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;foreach&lt;/span&gt;&lt;span style="color: black;"&gt; (&lt;/span&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt;&lt;span style="color: black;"&gt; employee &lt;/span&gt;&lt;span style="color: Blue;"&gt;in&lt;/span&gt;&lt;span style="color: black;"&gt; department.Employees)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Console&lt;/span&gt;&lt;span style="color: black;"&gt;.WriteLine(&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;"\t{0}"&lt;/span&gt;&lt;span style="color: black;"&gt;, employee.Name);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;Flattening a sequence is a job for &lt;a href="http://msdn2.microsoft.com/en-us/library/system.linq.enumerable.selectmany.aspx"&gt;SelectMany&lt;/a&gt;. The trick is in knowing that adding an additional &lt;em&gt;from&lt;/em&gt; clause translates to a SelectMany operator, and just like the outer joins of SQL, we need to project a null value when no employee exists for a given department – this is the job of DefaultIfEmpty.
&lt;/p&gt;
&lt;div style="border: 1pt solid black; font-family: monospace; font-size: 8pt; background-color: rgb(211, 211, 189);"&gt;
&lt;span style="color: Blue;"&gt;var&lt;/span&gt;&lt;span style="color: black;"&gt; query =&lt;br&gt;
&lt;/span&gt;&lt;span style="color: Blue;"&gt;&amp;nbsp; from&lt;/span&gt;&lt;span style="color: black;"&gt; department &lt;/span&gt;&lt;span style="color: Blue;"&gt;in&lt;/span&gt;&lt;span style="color: black;"&gt; departments&lt;br&gt;
&lt;/span&gt;&lt;span style="color: Blue;"&gt;&amp;nbsp; join&lt;/span&gt;&lt;span style="color: black;"&gt; employee &lt;/span&gt;&lt;span style="color: Blue;"&gt;in&lt;/span&gt;&lt;span style="color: black;"&gt; employees&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;on&lt;/span&gt;&lt;span style="color: black;"&gt; department.ID &lt;/span&gt;&lt;span style="color: Blue;"&gt;equals&lt;/span&gt;&lt;span style="color: black;"&gt; employee.DepartmentID&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: Blue;"&gt;&amp;nbsp; into&lt;/span&gt;&lt;span style="color: black;"&gt; employeeGroups&lt;br&gt;
&lt;/span&gt;&lt;span style="color: Blue;"&gt;&amp;nbsp; from&lt;/span&gt;&lt;span style="color: black;"&gt; employee &lt;/span&gt;&lt;span style="color: Blue;"&gt;in&lt;/span&gt;&lt;span style="color: black;"&gt; employeeGroups.DefaultIfEmpty()&lt;br&gt;
&lt;/span&gt;&lt;span style="color: Blue;"&gt;&amp;nbsp; select&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: Blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; { DepartmentName = department.Name, EmployeeName = employee.Name };&lt;br&gt;
&lt;/span&gt;
&lt;/div&gt;	
&lt;p&gt;One last catch – this query does work with LINQ to SQL, but if you are stubbing out a layer using in-memory collections, the query can easily throw a null reference exception. The last tweak would be to make sure you have a non-null employee object before asking for the Name property in the last &lt;em&gt;select&lt;/em&gt;. 
&lt;/p&gt;&lt;img src="http://odetocode.com/Blogs/aggbug.aspx?PostID=11907" width="1" height="1"&gt;</description></item></channel></rss>