<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://codebetter.com/utility/FeedStylesheets/rss.xsl" media="screen"?><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>Steve Hebert's Development Blog</title><link>http://codebetter.com/blogs/steve.hebert/default.aspx</link><description>Steve&amp;#39;s Blog - From .Net to dotMath and everything in between.</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>Old Code, New Testing Tricks - breaking old habits</title><link>http://codebetter.com/blogs/steve.hebert/archive/2008/10/08/old-code-new-testing-tricks-breaking-old-habits.aspx</link><pubDate>Wed, 08 Oct 2008 13:59:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:183712</guid><dc:creator>shebert</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/steve.hebert/rsscomments.aspx?PostID=183712</wfw:commentRss><comments>http://codebetter.com/blogs/steve.hebert/archive/2008/10/08/old-code-new-testing-tricks-breaking-old-habits.aspx#comments</comments><description>&lt;p&gt;I ran into a variation on an old threading problem the other day that I found nearly impossible to unit test.&amp;nbsp; When I say impossible, getting my test scenario to succeed meant the guaranteed setting of two threading primitives before a WaitHandle evaluation occurred.&amp;nbsp; Getting this to run properly every time requires some fancy test code which is where I stop and say to myself - &amp;quot;there has to be a better approach.&amp;quot;&lt;/p&gt;
&lt;p&gt;The resolution is extremely simple, but in a solution I&amp;#39;ve coded up many times in different situations, it takes a little more thought to break old habits and get it right.&amp;nbsp; It&amp;#39;s that &amp;#39;ah-ha&amp;#39; moment that made this enjoyable.&amp;nbsp; &lt;/p&gt;
&lt;h2&gt;Getting to the Testability Problem...&lt;/h2&gt;
&lt;p&gt;The problem itself is specific to&amp;nbsp;a threading situation - and it occurs when combining the fact that you can&amp;#39;t just throw an unhandled exception from a thread and you want to give precedence to the abort event.&amp;nbsp; In the case where both the work and abort events below are signaled prior to the &lt;em&gt;.WaitAny()&lt;/em&gt; call being evaluated, the &lt;em&gt;AbandonedWorkItemException&lt;/em&gt; must be raised to let the client know that the target work item was not handled.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://codebetter.com/blogs/steve.hebert/WindowsLiveWriter/OldCodeNewTestingTricksbreakingoldhabits_7E30/BadCode_2.png"&gt;&lt;img style="BORDER-RIGHT:0px;BORDER-TOP:0px;BORDER-LEFT:0px;BORDER-BOTTOM:0px;" height="265" alt="BadCode" src="http://codebetter.com/blogs/steve.hebert/WindowsLiveWriter/OldCodeNewTestingTricksbreakingoldhabits_7E30/BadCode_thumb.png" width="546" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;As you can see, this makes testing line #29 extremely difficult.&lt;/p&gt;
&lt;h2&gt;Stepping Back for Minute...&lt;/h2&gt;
&lt;p&gt;So I sat back, went back to the basics and asked myself - what is this class&amp;#39; responsibility?&amp;nbsp; The answer was simple - maintain thread state &lt;u&gt;and&lt;/u&gt; synchronize thread access.&amp;nbsp; The &amp;#39;and&amp;#39; points out the problem - one of these responsibilities needs to be refactored. As I mentioned earlier, the solution is quite simple - I first refactored the threading work into another class and then extracted the members to an interface to support injection. The interface looks like this:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://codebetter.com/blogs/steve.hebert/WindowsLiveWriter/OldCodeNewTestingTricksbreakingoldhabits_7E30/interface_2.png"&gt;&lt;img style="BORDER-RIGHT:0px;BORDER-TOP:0px;BORDER-LEFT:0px;BORDER-BOTTOM:0px;" height="97" alt="interface" src="http://codebetter.com/blogs/steve.hebert/WindowsLiveWriter/OldCodeNewTestingTricksbreakingoldhabits_7E30/interface_thumb.png" width="223" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;This results in a much more readable ThreadProc function as shown below.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://codebetter.com/blogs/steve.hebert/WindowsLiveWriter/OldCodeNewTestingTricksbreakingoldhabits_7E30/GoodCode_2.png"&gt;&lt;img style="BORDER-RIGHT:0px;BORDER-TOP:0px;BORDER-LEFT:0px;BORDER-BOTTOM:0px;" height="207" alt="GoodCode" src="http://codebetter.com/blogs/steve.hebert/WindowsLiveWriter/OldCodeNewTestingTricksbreakingoldhabits_7E30/GoodCode_thumb.png" width="583" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Turning attention back to the ThreadProc function, the old line #29 becomes line #25 in the new code, and it is now easily tested with a mocking class or I can simply code up my interface mock expectations with something like RhinoMocks using:&lt;/p&gt;
&lt;p&gt;Expect.Call(synchHandler.ExecuteWorkerItem).Return(false); &lt;br /&gt;Expect.Call(synchHandler.WorkerEventSignaled).Return(true);&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=183712" width="1" height="1"&gt;</description></item><item><title>CSLA and Telerik radGrid- a collection of posts</title><link>http://codebetter.com/blogs/steve.hebert/archive/2008/07/10/csla-and-telerik-radgrid-a-collection-of-posts.aspx</link><pubDate>Thu, 10 Jul 2008 18:40:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:180662</guid><dc:creator>shebert</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I am busy finishing up some knowledge transfer and found the need to gather together various postings I have done here and elsewhere on getting CSLA and Telerik playing nice.&amp;nbsp; A few of these topics deal with generic binding issues (CSLA aside).&amp;nbsp; Here are the items...&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Converations on CSLA and Telerik radGrid&lt;/p&gt;
&lt;p&gt;Conversation: &lt;a class="" href="http://forums.lhotka.net/forums/thread/20887.aspx" target="_blank"&gt;Using the radGrid AddNew functionality with CSLA&lt;/a&gt; &lt;br /&gt;Code: &lt;a class="" href="http://forums.lhotka.net/forums/17220/ShowThread.aspx" target="_blank"&gt;Databound (IBindableList/IReportTotalRowCount) Paging and Sorting to a control&lt;/a&gt;&amp;nbsp; &lt;br /&gt;Step-by-Step: &lt;a class="" href="http://codebetter.com/blogs/steve.hebert/archive/2007/02/25/Hiearchical-data-binding-with-CSLA-and-Telerik_2700_s-radGrid-control_2E00_.aspx" target="_blank"&gt;Hierarchical data binding with CSLA and Telerik&amp;#39;s radGrid Control&lt;/a&gt; &lt;br /&gt;Code: &lt;a class="" href="http://codebetter.com/blogs/steve.hebert/archive/2007/02/24/Setting-up-CSLA-databinding-on-a-webpage-using-an-_4000_Register-tag.aspx" target="_blank"&gt;Setting up CSLA databinding on a webpage using an @Register tag&lt;/a&gt;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=180662" width="1" height="1"&gt;</description></item><item><title>Creating a Horizontal GridSplitter in WPF - for real</title><link>http://codebetter.com/blogs/steve.hebert/archive/2008/04/16/creating-a-horizontal-gridsplitter-for-real.aspx</link><pubDate>Wed, 16 Apr 2008 21:25:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:176735</guid><dc:creator>shebert</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/steve.hebert/rsscomments.aspx?PostID=176735</wfw:commentRss><comments>http://codebetter.com/blogs/steve.hebert/archive/2008/04/16/creating-a-horizontal-gridsplitter-for-real.aspx#comments</comments><description>&lt;p&gt;I ran into a number of articles on the web declaring how to create a horizontal grid splitter control in WPF - most of them wrong. There are a couple of &amp;quot;Walkthru&amp;quot; articles on MSDN that show the proper way to do it, but waste time poking around the Properties window (who codes like that anyway?).&amp;nbsp;Besides, they are not all consistent&amp;nbsp;- the &lt;a class="" href="http://msdn2.microsoft.com/en-us/library/bb675313.aspx" target="_blank"&gt;first&amp;nbsp;article&lt;/a&gt;&amp;nbsp;I found calls for setting&amp;nbsp;properties&amp;nbsp;that are not listed in the &lt;a class="" href="http://msdn2.microsoft.com/en-us/library/bb546954.aspx" target="_blank"&gt;second article I found&lt;/a&gt;&amp;nbsp;and seem to be extraneous.&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;So here is a concise description focusing on the XAML alone&amp;nbsp;- I haven&amp;#39;t found a decent XAML code beautifier on the web yet so bare with me.&amp;nbsp; I am not inheriting any styles as you can see below.&lt;/p&gt;
&lt;p&gt;First,&amp;nbsp; create a Grid with an additional row to host the horizontal splitter.&amp;nbsp; Note that in this example I have two columns in my grid to show the spanning function:&lt;/p&gt;
&lt;p&gt;&amp;lt;Grid VerticalAlignment=&amp;quot;Stretch&amp;quot; HorizontalAlignment=&amp;quot;Stretch&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid.ColumnDefinitions &amp;gt;&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;lt;ColumnDefinition Width=&amp;quot;*&amp;quot; /&amp;gt;&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;lt;ColumnDefinition Width=&amp;quot;*&amp;quot;&amp;nbsp; /&amp;gt;&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;lt;/Grid.ColumnDefinitions&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid.RowDefinitions&amp;gt;&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;lt;RowDefinition Height=&amp;quot;*&amp;quot; /&amp;gt;&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;lt;RowDefinition Height=&amp;quot;Auto&amp;quot; /&amp;gt;&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;lt;RowDefinition Height=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid.RowDefinitions&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Next, create a GridSplitter on row #1 (remember that row indices are 0 based).&amp;nbsp; &lt;/p&gt;
&lt;p&gt;&amp;lt;GridSplitter&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; ResizeDirection=&amp;quot;Rows&amp;quot; &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; Grid.Column=&amp;quot;0&amp;quot; &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; Grid.ColumnSpan=&amp;quot;2&amp;quot; &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; Grid.Row=&amp;quot;1&amp;quot;&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; Width=&amp;quot;Auto&amp;quot; &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; Height=&amp;quot;3&amp;quot; &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; HorizontalAlignment=&amp;quot;Stretch&amp;quot; &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; VerticalAlignment=&amp;quot;Stretch&amp;quot; &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; Margin=&amp;quot;0&amp;quot;/&amp;gt;&lt;/p&gt;
&lt;p&gt;And there you have it.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=176735" width="1" height="1"&gt;</description></item><item><title>Linq to Objects – measuring performance implications (part 1)</title><link>http://codebetter.com/blogs/steve.hebert/archive/2008/02/06/linq-to-objects-relating-data-structure-organization-to-where-clause-optimization.aspx</link><pubDate>Wed, 06 Feb 2008 11:02:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:174040</guid><dc:creator>shebert</dc:creator><slash:comments>26</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/steve.hebert/rsscomments.aspx?PostID=174040</wfw:commentRss><comments>http://codebetter.com/blogs/steve.hebert/archive/2008/02/06/linq-to-objects-relating-data-structure-organization-to-where-clause-optimization.aspx#comments</comments><description>&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;After working with Linq-to-objects, I started thinking about how this tool could work in the wrong hands.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;At its simplest, a seemingly elegant query could easily turn into a CPU hog if the underlying data structure isn’t organized well.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; At its best, how will these queries make use of the underlying data structures?&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;What to do?&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Write some code and get some numbers to compare.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;What I found was interesting, eye-opening&amp;nbsp;and opened more questions for another day. I set out to compare Linq performance over a reasonably well-optimized data structure by varying the where clause composition and also comparing this to code going directly after the data structure in typical pre-Linq fashion.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;What I learned was fascinating – let’s take a look at the code&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Given a dictionary defined as: &lt;br /&gt;&lt;em&gt;private Dictionary&amp;lt;int, string&amp;gt; _lookupList = new Dictionary&amp;lt;int, string&amp;gt;();&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;I populate it using a loop where the upper limit is a const I can vary:&lt;br /&gt;&lt;em&gt;for (int x = 0; x &amp;lt; _listSize; x++ )&lt;br /&gt;&lt;span style="mso-spacerun:yes;"&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; &lt;/span&gt;_lookupList.Add(x, string.Format(&amp;quot;item#{0}&amp;quot;, x));&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;I can then use Linq to query the item dictionary with something like this:&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;span style="mso-spacerun:yes;"&gt;&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;em&gt;string[] myResult = (from i in _lookupList&lt;br /&gt;&lt;span style="mso-spacerun:yes;"&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; &lt;/span&gt;where i.Key &amp;gt;= lowerLimit &amp;amp;&amp;amp; i.Key &amp;lt;= upperLimit &amp;amp;&amp;amp; i.Value.Contains(&amp;quot;1&amp;quot;) &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&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; &lt;/span&gt;select i.Value).ToArray();&lt;/em&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Let’s take three variations as follows:&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpFirst" style="MARGIN:0in 0in 0pt 0.75in;TEXT-INDENT:-0.25in;mso-add-space:auto;mso-list:l1 level1 lfo1;"&gt;&lt;span style="mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;font face="Calibri" size="3"&gt;1)&lt;/font&gt;&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;where i.Key &amp;gt;= lowerLimit &amp;amp;&amp;amp; i.Key &amp;lt;= upperLimit &amp;amp;&amp;amp; i.Value.Contains(&amp;quot;1&amp;quot;)&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="MARGIN:0in 0in 0pt 0.75in;TEXT-INDENT:-0.25in;mso-add-space:auto;mso-list:l1 level1 lfo1;"&gt;&lt;span style="mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;font face="Calibri" size="3"&gt;2)&lt;/font&gt;&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;where i.Value.Contains(&amp;quot;1&amp;quot;) &amp;amp;&amp;amp; i.Key &amp;gt;= lowerLimit &amp;amp;&amp;amp; i.Key &amp;lt;= upperLimit&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpLast" style="MARGIN:0in 0in 10pt 0.75in;TEXT-INDENT:-0.25in;mso-add-space:auto;mso-list:l1 level1 lfo1;"&gt;&lt;span style="mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;font face="Calibri" size="3"&gt;3)&lt;/font&gt;&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Hand-code the query to go against the data structure&amp;nbsp;to compare performance.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;To make sure I varied the access in different areas of the dictionary, the query was performed against 10 discrete key values in the beginning, middle and end of the dictionary. Performance was consistent across each item, showing that Linq was utilizing the datastructure to some degree – as expected.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;The .Contains method further reduced the return set to range from 1-2 items depending on where the midpoint was calculated. These test sets were run 10 times and the averages taken.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;&lt;strong&gt;The results:&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Item#1 – averaged 2643 ms&lt;br /&gt;Item#2 – averaged 671 ms&lt;br /&gt;Item#3 – averaged &amp;lt;1 ms&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;&lt;strong&gt;Observations:&lt;/strong&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;The difference between #1 and #2 is a factor of 4. &lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;I am not sure how this actually performed but I suspect that&amp;nbsp;item #2 scanned the entire contents of the dictionary.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;It is hard to tell since a test where you eliminate the where clause results in a very different memory allocation pattern and therefore inherently larger timing numbers.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;The difference between #3 and the other items is staggering.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Keep in mind, I tried to handicap this with a try/catch block around the indexer into the dictionary, stored the matching values in a List&amp;lt;string&amp;gt; and then performed a List&amp;lt;string&amp;gt;.ToArray() just for good measure.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;That’s eye popping – it’s more than two factors of 10 faster than the best optimized Linq query and more than three factors of 10 faster than the worst optimized.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;Bottom line - despite my best efforts I just couldn’t make my hand-written code perform as poorly as Linq.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;span style="mso-spacerun:yes;"&gt;&lt;strong&gt;Summary:&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;So what did I learn?&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpFirst" style="MARGIN:0in 0in 0pt 0.5in;TEXT-INDENT:-0.25in;mso-list:l0 level1 lfo2;"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-bidi-font-family:Symbol;mso-fareast-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Variations on where-clause construction have an implied order when considering performance.&amp;nbsp; What are these implied rules exactly?&amp;nbsp; I&amp;#39;d love to know.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="MARGIN:0in 0in 0pt 0.5in;TEXT-INDENT:-0.25in;mso-list:l0 level1 lfo2;"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-bidi-font-family:Symbol;mso-fareast-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;An entirely different test would have to be constructed to understand join performance.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="MARGIN:0in 0in 0pt 0.5in;TEXT-INDENT:-0.25in;mso-list:l0 level1 lfo2;"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-bidi-font-family:Symbol;mso-fareast-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;How does the [Indexable] attribute play into optimization choices and what are the performance considerations of that attribute?&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpLast" style="MARGIN:0in 0in 10pt 0.5in;TEXT-INDENT:-0.25in;mso-list:l0 level1 lfo2;"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-bidi-font-family:Symbol;mso-fareast-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;When doing intensive object querying,&amp;nbsp; Linq for Objects needs to be&amp;nbsp;eyed very carefully in context of the application.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;+++&amp;nbsp; Addition per Comment&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here is the code that Jimmy Bogard requested.&amp;nbsp; As noted in my post, I added exception handling and chose to use a List&amp;lt;string&amp;gt; to gather the match values and finally convert to an array of strings just as the Linq function did. If anything, I am going for the most conservative path in this case.&amp;nbsp; The call to this function is responsible for time measurement.&lt;/p&gt;
&lt;p&gt;private void HandCodedAccessorFunction(int lowerLimit, int upperLimit)&lt;br /&gt;&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; List&amp;lt;string&amp;gt; result = new List&amp;lt;string&amp;gt;();&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; int y = 0;&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; for (int x = lowerLimit; x &amp;lt;= upperLimit; x++)&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; {&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; try&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; {&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; if (_lookupList[x].Contains(&amp;quot;1&amp;quot;))&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; {&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; result.Add(_lookupList[x]);&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; y++;&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; }&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; }&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; catch (Exception)&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; {&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; Console.Writeline(&amp;quot;Exception thrown&amp;quot;);&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; }&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; }&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; string[] ar = result.ToArray();&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; Console.WriteLine(y);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=174040" width="1" height="1"&gt;</description><category domain="http://codebetter.com/blogs/steve.hebert/archive/tags/Featured/default.aspx">Featured</category></item><item><title>Manually Mapping WSDL soap:address location on the fly</title><link>http://codebetter.com/blogs/steve.hebert/archive/2007/11/13/manually-mapping-wsdl-soap-address-location-on-the-fly.aspx</link><pubDate>Tue, 13 Nov 2007 11:31:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:170842</guid><dc:creator>shebert</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/steve.hebert/rsscomments.aspx?PostID=170842</wfw:commentRss><comments>http://codebetter.com/blogs/steve.hebert/archive/2007/11/13/manually-mapping-wsdl-soap-address-location-on-the-fly.aspx#comments</comments><description>&lt;p&gt;&amp;nbsp;.Net does a nice job of sensing the underlying protocol when generating WSDL. For instance,&amp;nbsp; if I run a service as &amp;quot;myService&amp;quot; on SSL, the underlying WSDL is wired to contain the &amp;lt;soap:address&amp;gt; location mapped to &amp;quot;&lt;a href="https://.../"&gt;https://...&lt;/a&gt;&amp;quot; instead of &amp;quot;http://...&amp;quot;&amp;nbsp; However there are times when this sensing is not enough.&lt;/p&gt;
&lt;p&gt;Case in Point: You can offload the encryption to your load balancer which frees up your server CPUs to do work-critical tasks.&amp;nbsp; In this case your &lt;em&gt;&lt;u&gt;clients talk to your load balancer through https and the communication between the load balancer and server happens through http&lt;/u&gt;&lt;/em&gt;.&amp;nbsp; Therein lies the problem.&amp;nbsp; The .Net automatic sensing in this case isn&amp;#39;t good enough - because while the local machine is talking http, the client is talking over https and the resulting WSDL being published by your webservice is no longer correct.&lt;/p&gt;
&lt;p&gt;Since .Net does not provide a mechanism for handling this,&amp;nbsp;we need a mechanism to rewire the wsdl on-the-fly in this case.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Handling this took a bunch of digging and feels extremely hack-ish.&amp;nbsp; But it&amp;#39;s a necessity in this scenario.&amp;nbsp; To accomplish this task take the following steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div&gt;Derive a class from SoapExtensionReflector that overrides the ReflectMethod().&amp;nbsp; &lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Handle the remapping in the ReflectMethod() of the class created above.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Reference your new class under the webServices/soapExtensionReflectorTypes in web.config.&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Here is a sample of the derived class:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class SoapAddressReflector : SoapExtensionReflector&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void ReflectMethod()&lt;br /&gt;&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; ServiceDescription sd = ReflectionContext.ServiceDescription;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (Service service in sd.Services)&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; {&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; foreach( Port port in service.Ports)&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; {&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; foreach (ServiceDescriptionFormatExtension extension in port.Extensions)&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; {&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; &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; SoapAddressBinding address = (SoapAddressBinding)extension;&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; address.Location = RemapHttpReferencesToHttps(address.Location);&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; }&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; }&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; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string RemapHttpReferencesToHttps( string location )&lt;br /&gt;&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; return location.Replace(&amp;quot;http:&amp;quot;, &amp;quot;https:&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Here is the code to add to the web.config file:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;webServices&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;soapExtensionReflectorTypes&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add type=&amp;quot;Reuters.DataScopeSelect.Web.Api.SoapAddressReflector, Reuters.DataScopeSelect.Web.Api&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/soapExtensionReflectorTypes&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/webServices&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;For a bogus webservice named &amp;quot;myService&amp;quot; running server-native on http, the modified wsdl appears as follows:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a class="b" href="https://eap.hosted.datascopeapi.reuters.com/datascopeapi/extractionservice.asmx?WSDL#"&gt;&lt;strong&gt;&lt;font face="Courier New" color="#ff0000"&gt;-&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt; &lt;span class="m"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#990000"&gt;&lt;span class="t"&gt;wsdl:service&lt;/span&gt;&lt;span class="t"&gt; name&lt;/span&gt;&lt;/font&gt;&lt;span class="m"&gt;&lt;font color="#0000ff"&gt;=&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;b&gt;myService&lt;/b&gt;&lt;font color="#0000ff"&gt;&lt;span class="m"&gt;&amp;quot;&lt;/span&gt;&lt;span class="m"&gt;&amp;gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;div class="e"&gt;
&lt;div&gt;
&lt;div class="e"&gt;
&lt;div class="c" style="MARGIN-LEFT:1em;TEXT-INDENT:-2em;"&gt;&lt;a class="b" href="https://eap.hosted.datascopeapi.reuters.com/datascopeapi/extractionservice.asmx?WSDL#"&gt;&lt;strong&gt;&lt;font face="Courier New" color="#ff0000"&gt;-&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt; &lt;span class="m"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#990000"&gt;&lt;span class="t"&gt;wsdl:port&lt;/span&gt;&lt;span class="t"&gt; name&lt;/span&gt;&lt;/font&gt;&lt;span class="m"&gt;&lt;font color="#0000ff"&gt;=&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;b&gt;myServiceSoap&lt;/b&gt;&lt;span class="m"&gt;&lt;font color="#0000ff"&gt;&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;span class="t"&gt;&lt;font color="#990000"&gt; binding&lt;/font&gt;&lt;/span&gt;&lt;span class="m"&gt;&lt;font color="#0000ff"&gt;=&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;b&gt;tns:ExtractionServiceSoap&lt;/b&gt;&lt;font color="#0000ff"&gt;&lt;span class="m"&gt;&amp;quot;&lt;/span&gt;&lt;span class="m"&gt;&amp;gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div class="e"&gt;
&lt;div style="MARGIN-LEFT:1em;TEXT-INDENT:-2em;"&gt;&lt;span class="b"&gt;&lt;strong&gt;&lt;font face="Courier New" color="#ff0000"&gt;&amp;nbsp;&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt; &lt;span class="m"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span class="t"&gt;&lt;font color="#990000"&gt;soap:address&lt;/font&gt;&lt;/span&gt; &lt;span class="t"&gt;&lt;font color="#990000"&gt;location&lt;/font&gt;&lt;/span&gt;&lt;span class="m"&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;b&gt;&lt;a href="https://mypublicservice.com/myservice.asmx"&gt;https://mypublicservice.com/myservice.asmx&lt;/a&gt;&lt;/b&gt;&lt;font color="#0000ff"&gt;&lt;span class="m"&gt;&lt;/span&gt;&lt;span class="m"&gt; /&amp;gt;&lt;/span&gt;&lt;/font&gt; &lt;/div&gt;&lt;/div&gt;
&lt;div&gt;&lt;span class="b"&gt;&lt;strong&gt;&lt;font face="Courier New" color="#ff0000"&gt;&amp;nbsp;&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt; &lt;span class="m"&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;/span&gt;&lt;span class="t"&gt;&lt;font color="#990000"&gt;wsdl:port&lt;/font&gt;&lt;/span&gt;&lt;span class="m"&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="e"&gt;
&lt;div class="c" style="MARGIN-LEFT:1em;TEXT-INDENT:-2em;"&gt;&lt;a class="b" href="https://eap.hosted.datascopeapi.reuters.com/datascopeapi/extractionservice.asmx?WSDL#"&gt;&lt;strong&gt;&lt;font face="Courier New" color="#ff0000"&gt;-&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt; &lt;span class="m"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#990000"&gt;&lt;span class="t"&gt;wsdl:port&lt;/span&gt;&lt;span class="t"&gt; name&lt;/span&gt;&lt;/font&gt;&lt;span class="m"&gt;&lt;font color="#0000ff"&gt;=&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;b&gt;myServiceSoap12&lt;/b&gt;&lt;span class="m"&gt;&lt;font color="#0000ff"&gt;&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;span class="t"&gt;&lt;font color="#990000"&gt; binding&lt;/font&gt;&lt;/span&gt;&lt;span class="m"&gt;&lt;font color="#0000ff"&gt;=&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;b&gt;tns:myServiceSoap12&lt;/b&gt;&lt;font color="#0000ff"&gt;&lt;span class="m"&gt;&amp;quot;&lt;/span&gt;&lt;span class="m"&gt;&amp;gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div class="e"&gt;
&lt;div style="MARGIN-LEFT:1em;TEXT-INDENT:-2em;"&gt;&lt;span class="b"&gt;&lt;strong&gt;&lt;font face="Courier New" color="#ff0000"&gt;&amp;nbsp;&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt; &lt;span class="m"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span class="t"&gt;&lt;font color="#990000"&gt;soap12:address&lt;/font&gt;&lt;/span&gt; &lt;span class="t"&gt;&lt;font color="#990000"&gt;location&lt;/font&gt;&lt;/span&gt;&lt;span class="m"&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;b&gt;&lt;a href="https://mypublicservice.com/myservice.asmx"&gt;https://mypublicservice.com/myservice.asmx&lt;/a&gt;&lt;/b&gt;&lt;font color="#0000ff"&gt;&lt;span class="m"&gt;&lt;/span&gt;&lt;span class="m"&gt; /&amp;gt;&lt;/span&gt;&lt;/font&gt; &lt;/div&gt;&lt;/div&gt;
&lt;div&gt;&lt;span class="b"&gt;&lt;strong&gt;&lt;font face="Courier New" color="#ff0000"&gt;&amp;nbsp;&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt; &lt;span class="m"&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;/span&gt;&lt;span class="t"&gt;&lt;font color="#990000"&gt;wsdl:port&lt;/font&gt;&lt;/span&gt;&lt;span class="m"&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div&gt;&lt;span class="b"&gt;&lt;strong&gt;&lt;font face="Courier New" color="#ff0000"&gt;&amp;nbsp;&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt; &lt;span class="m"&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;/span&gt;&lt;span class="t"&gt;&lt;font color="#990000"&gt;wsdl:service&lt;/font&gt;&lt;/span&gt;&lt;span class="m"&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div&gt;&lt;span class="b"&gt;&lt;strong&gt;&lt;font face="Courier New" color="#ff0000"&gt;&amp;nbsp;&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt; &lt;span class="m"&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;/span&gt;&lt;span class="t"&gt;&lt;font color="#990000"&gt;wsdl:definitions&lt;/font&gt;&lt;/span&gt;&lt;span class="m"&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span class="m"&gt;&lt;font color="#0000ff"&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span class="m"&gt;&lt;font color="#0000ff"&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=170842" width="1" height="1"&gt;</description></item><item><title>Optimizing Hierarchical data for Tree Controls</title><link>http://codebetter.com/blogs/steve.hebert/archive/2007/09/27/optimizing-hierarchical-data-for-tree-controls.aspx</link><pubDate>Thu, 27 Sep 2007 19:51:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:168785</guid><dc:creator>shebert</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/steve.hebert/rsscomments.aspx?PostID=168785</wfw:commentRss><comments>http://codebetter.com/blogs/steve.hebert/archive/2007/09/27/optimizing-hierarchical-data-for-tree-controls.aspx#comments</comments><description>&lt;p class="MsoNormal" style="MARGIN:0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;On one hand, nothing can substitute good data design when it comes to performance.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;On the other hand, relational databases are terrible at describing hierarchical relationships.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Vendors have been including hierarchical relationship query tools for years (i.e. Oracle and MS Sql Server 2005), but while the semantics are cleaned up, performance is lacking because tree traversals on relational structures are time consuming.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;So where does that leave us?&lt;/font&gt;&lt;/p&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;p class="MsoNormal" style="MARGIN:0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;In putting together this post, I ended up solving this problem once again and realized just how little accessible information is on the topic.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;By accessible, I mean not requiring a degree in tree theory (half joking).&amp;nbsp; Personally, I find I learn best by seeing a complete solution that works, understanding it and then applying new theory on top of it. &amp;nbsp;&lt;/span&gt;That begs the questions – is this post more accessible?&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;To me it is - so I&amp;#39;ll run with it.&lt;/font&gt;&lt;/p&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;p class="MsoNormal" style="MARGIN:0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;Let’s set a rough goal – when asked about an item, I should be able to answer questions about or return its related tree structure in one sql statement.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;I should also be able to do so without using vendor-specific extensions.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;The best books that deal with this process dive into trees and graphs and analyze the pros and cons of different structures.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;However, I have found that (1) most of the times that I am looking at these situations I am looking at reference data that tends to be very static and (2) I am typically populating some type of tree control with this data.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;In these situations, I would argue that some of these mechanisms are more than what I need.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;This post looks at a problem of delivering a tree structure to a user interface and the process of refining the database tables.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; For this post &lt;/span&gt;I am using the typical employee/boss relationship to illustrate the problem.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;This approach also applies to other areas as well: manufacturing bill of materials, order operations in medical scenarios, etc. with some caveats.&lt;/font&gt;&lt;/p&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;h2 style="MARGIN:12pt 0in 3pt;"&gt;&lt;em&gt;Digging In&lt;/em&gt;&lt;/h2&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;p class="MsoNormal" style="MARGIN:0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;Let’s say we are given a table of the typical employee/boss relationship.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;These tables are so boring it’s not even worth coming up with names so I’ll use letters:&lt;/font&gt;&lt;/p&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;table class="MsoNormalTable" style="MARGIN:auto auto auto 4.65pt;WIDTH:106.05pt;BORDER-COLLAPSE:collapse;mso-padding-alt:0in 5.4pt 0in 5.4pt;" cellspacing="0" cellpadding="0" class="MsoNormalTable"&gt;

&lt;tr style="HEIGHT:12.75pt;mso-yfti-irow:0;mso-yfti-firstrow:yes;"&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:windowtext 1pt solid;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:windowtext 1pt solid;WIDTH:58.05pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-alt:solid windowtext .5pt;"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;Employee&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:windowtext 1pt solid;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-top-alt:solid windowtext .5pt;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;Boss&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:12.75pt;mso-yfti-irow:1;"&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:windowtext 1pt solid;WIDTH:58.05pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;G&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;C&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:12.75pt;mso-yfti-irow:2;"&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:windowtext 1pt solid;WIDTH:58.05pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;E&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;B&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:12.75pt;mso-yfti-irow:3;"&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:windowtext 1pt solid;WIDTH:58.05pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;B&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;A&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:12.75pt;mso-yfti-irow:4;"&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:windowtext 1pt solid;WIDTH:58.05pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;C&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;A&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:12.75pt;mso-yfti-irow:5;"&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:windowtext 1pt solid;WIDTH:58.05pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;D&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;B&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:12.75pt;mso-yfti-irow:6;"&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:windowtext 1pt solid;WIDTH:58.05pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;F&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;C&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:12.75pt;mso-yfti-irow:7;"&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:windowtext 1pt solid;WIDTH:58.05pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;A&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;null&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:12.75pt;mso-yfti-irow:8;mso-yfti-lastrow:yes;"&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:windowtext 1pt solid;WIDTH:58.05pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;H&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;D&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;Table 1.1 – Employee&lt;/font&gt;&lt;/p&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;p class="MsoNormal" style="MARGIN:0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;If I were to populate a tree control, I need to consider the minimum amount of data to populate my control.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;I am going to assume that I will populate this control sequentially and that the use of simple hash-tables will be sufficient for establishing parent/child relationships.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Therefore, I need to have this ordered with the parent-less node first and the child-less nodes last.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;To process sequentially, I need to have these ordered by layer – therefore the first layer is fully understood so the successive layer is able to reach it’s parent when populating the tree.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Therefore, I need a result table that looks like this:&lt;/font&gt;&lt;/p&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;table class="MsoNormalTable" style="MARGIN:auto auto auto 4.65pt;WIDTH:2in;BORDER-COLLAPSE:collapse;mso-padding-alt:0in 5.4pt 0in 5.4pt;" cellspacing="0" cellpadding="0" class="MsoNormalTable"&gt;

&lt;tr style="HEIGHT:12.75pt;mso-yfti-irow:0;mso-yfti-firstrow:yes;"&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:windowtext 1pt solid;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:windowtext 1pt solid;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;Employee&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:windowtext 1pt solid;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-top-alt:solid windowtext .5pt;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;Boss&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:windowtext 1pt solid;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-top-alt:solid windowtext .5pt;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;Layer (optional)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:12.75pt;mso-yfti-irow:1;"&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:windowtext 1pt solid;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;A&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;Null&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;0&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:12.75pt;mso-yfti-irow:2;"&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:windowtext 1pt solid;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;B&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;A&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;1&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:12.75pt;mso-yfti-irow:3;"&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:windowtext 1pt solid;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;C&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;A&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;1&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:12.75pt;mso-yfti-irow:4;"&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:windowtext 1pt solid;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;D&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;B&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;2&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:12.75pt;mso-yfti-irow:5;"&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:windowtext 1pt solid;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;E&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;B&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;2&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:12.75pt;mso-yfti-irow:6;"&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:windowtext 1pt solid;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;F&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;C&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;2&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:12.75pt;mso-yfti-irow:7;"&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:windowtext 1pt solid;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;G&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;C&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;2&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:12.75pt;mso-yfti-irow:8;mso-yfti-lastrow:yes;"&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:windowtext 1pt solid;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;H&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;D&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;3&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;Table 1.2 - ProcessingResult&lt;/font&gt;&lt;/p&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;p class="MsoNormal" style="MARGIN:0in 0in 0pt;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;This structure, when processed sequentially, can be added to a tree control quite easily. Therefore what structure do I need to transform Table 1.1 into Table 2.2?&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Before I answer that question- lets think about other operations that are useful.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;ul style="MARGIN-TOP:0in;"&gt;
&lt;li class="MsoNormal" style="MARGIN:0in 0in 0pt;mso-list:l0 level1 lfo1;tab-stops:list .5in;"&gt;&lt;font face="Times New Roman" size="3"&gt;If I know employee, say &amp;nbsp;‘E&amp;#39;, I should be able to grab the entire hierarchary (or n-levels up from the position of ‘E’ within the tree) in a single select statement. Selecting down the tree requires a different edge structure than what I am showing here.&lt;/font&gt;&lt;/li&gt;
&lt;li class="MsoNormal" style="MARGIN:0in 0in 0pt;mso-list:l0 level1 lfo1;tab-stops:list .5in;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;I should also be able to determine that given two employees – are they part of the same reporting hiearchy?&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;
&lt;li class="MsoNormal" style="MARGIN:0in 0in 0pt;mso-list:l0 level1 lfo1;tab-stops:list .5in;"&gt;&lt;font face="Times New Roman" size="3"&gt;Is one subordinate to the other either directly or indirectly or are they peers? &lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;p class="MsoNormal" style="MARGIN:0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;As with any structure, these are a few of the questions that drive the design.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;I then decide that all of these should be query-able using a single select statement and easily optimized via one or more indices.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;We’ll come back to these questions with examples of SQL-SELECT statements in a bit.&lt;/font&gt;&lt;/p&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;h2 style="MARGIN:12pt 0in 3pt;"&gt;&lt;em&gt;Breaking down the problem&lt;/em&gt;&lt;/h2&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;p class="MsoNormal" style="MARGIN:0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;To accomplish this task, we’ll use basic tree theory – which is a special kind of directed graph.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Graphs are data structures where nodes (our Employee table) are connected by edges (defined below as EmployeeHierarchy).&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Each edge represents a one-way relationship.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;To satisify our query requirements, we need to be able to identify the larger structure that each node participates in.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;This could be a shared id, but in this case we’ll call it the RootBoss.&lt;/font&gt;&lt;/p&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;table class="MsoNormalTable" style="MARGIN:auto auto auto 4.65pt;WIDTH:192pt;BORDER-COLLAPSE:collapse;mso-padding-alt:0in 5.4pt 0in 5.4pt;" cellspacing="0" cellpadding="0" class="MsoNormalTable"&gt;

&lt;tr style="HEIGHT:12.75pt;mso-yfti-irow:0;mso-yfti-firstrow:yes;"&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:windowtext 1pt solid;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:windowtext 1pt solid;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;RootBoss&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:windowtext 1pt solid;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-top-alt:solid windowtext .5pt;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;Employee&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:windowtext 1pt solid;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-top-alt:solid windowtext .5pt;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;Boss &lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:windowtext 1pt solid;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-top-alt:solid windowtext .5pt;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;Layer&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:12.75pt;mso-yfti-irow:1;"&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:windowtext 1pt solid;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;A&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;A&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;Null&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;0&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:12.75pt;mso-yfti-irow:2;"&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:windowtext 1pt solid;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;A&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;B&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;A&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;1&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:12.75pt;mso-yfti-irow:3;"&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:windowtext 1pt solid;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;A&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;C&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;A&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;1&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:12.75pt;mso-yfti-irow:4;"&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:windowtext 1pt solid;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;A&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;D&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;B&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;2&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:12.75pt;mso-yfti-irow:5;"&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:windowtext 1pt solid;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;A&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;E&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;B&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;2&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:12.75pt;mso-yfti-irow:6;"&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:windowtext 1pt solid;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;A&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;F&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;C&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;2&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:12.75pt;mso-yfti-irow:7;"&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:windowtext 1pt solid;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;A&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;G&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;C&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;2&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="HEIGHT:12.75pt;mso-yfti-irow:8;mso-yfti-lastrow:yes;"&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:windowtext 1pt solid;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;A&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;H&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;D&lt;/span&gt;&lt;/td&gt;
&lt;td class="" style="BORDER-RIGHT:windowtext 1pt solid;PADDING-RIGHT:5.4pt;BORDER-TOP:#ece9d8;PADDING-LEFT:5.4pt;PADDING-BOTTOM:0in;BORDER-LEFT:#ece9d8;WIDTH:48pt;PADDING-TOP:0in;BORDER-BOTTOM:windowtext 1pt solid;HEIGHT:12.75pt;BACKGROUND-COLOR:transparent;mso-border-bottom-alt:solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Arial;"&gt;3&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;Table 1.3 – EmployeeHiearchy&lt;/font&gt;&lt;/p&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;p class="MsoNormal" style="MARGIN:0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;At this point, we have two solid questions (1) how do we satisfy our query requirements given these two tables and (2) how do we populate this thing?&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;First, lets get the fun part out of the way and look at how we query this table.&lt;/font&gt;&lt;/p&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;h2 style="MARGIN:12pt 0in 3pt;"&gt;&lt;em&gt;Performing the stated queries&lt;/em&gt;&lt;/h2&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;p class="MsoNormal" style="MARGIN:0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;First - given a single employee (@employee) – lets pull out the entire hierarchy:&lt;/font&gt;&lt;/p&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;br /&gt;&lt;/font&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;select a.RootBoss, b.Employee, c.employee, c.boss, b.Layer&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;from EmployeeHierarchy a&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;inner join EmployeeHierarchy b on a.RootBoss = b.RootBoss&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;br /&gt;&lt;/span&gt;&amp;nbsp; inner join Employee c on c.employee = b.employee&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;br /&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;where a.employee = @employee&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&amp;nbsp; order by b.Layer&lt;/span&gt;&lt;/b&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;p class="MsoNormal" style="MARGIN:0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;&lt;br /&gt;&lt;br /&gt;Next, let’s pull up the hierarchy above and equal to the employee:&lt;/font&gt;&lt;/p&gt;&lt;font face="Times New Roman" size="3"&gt;&lt;br /&gt;&lt;/font&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;select a.RootBoss, b.EmployeeName, c.employee, c.boss, b.Layer&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&amp;nbsp; from EmployeeHierarchy a&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;inner join EmployeeHierarchy b on a.RootBoss = b.RootBoss&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;inner join Employee c on c.employee = b.employee&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;where a.employee = @employee&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;and a.layer&amp;nbsp;&amp;gt;=&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;b.layer&lt;/span&gt;&lt;/b&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt; &lt;/font&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;&lt;br /&gt;&lt;br /&gt;Given @employee1 and @employee2, are they part of the same reporting structure?&lt;/font&gt;&lt;/p&gt;&lt;font face="Times New Roman" size="3"&gt;&lt;br /&gt;&lt;/font&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;select case when (select count(*)&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;from EmployeeHierarchy a&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;inner join EmployeeHierarchy b on b.rootboss = a.rootboss&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;where a.employee = @employee1&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;and b.employee = @employee2 ) &amp;gt; 0&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;then ‘t’ else ‘f’ end as is_true&lt;/span&gt;&lt;/b&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;Finally, determine if employee1 is higher on the same reporting structure than employee2 (i.e. employee 2 reports to employee 1 either directly or indirectly).&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;select case when (select count(*)&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;from EmployeeHierarchy a&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;inner join EmployeeHierarchy b on b.rootboss = a.rootboss&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;where a.employee = @employee1&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;and b.employee = @employee2 &lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;and a.layer &amp;lt; b.layer) &amp;gt; 0&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;then ‘t’ else ‘f’ end as is_true&lt;/span&gt;&lt;/b&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;h2 style="MARGIN:12pt 0in 3pt;"&gt;&lt;em&gt;Populating the EmployeeHierarchy table (the edges)&lt;/em&gt;&lt;/h2&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;p class="MsoNormal" style="MARGIN:0in 0in 0pt;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;Because the number of layers is variable you can use an iteration process – or – this is a great place for using vendor specific hierarchy extensions.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;In the spirit of keeping this as vendor-neutral as possible, I’ll ignore the extensions. &lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;As such this is a simple, two-step process.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;p class="MsoNormal" style="MARGIN:0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;First, we must find all of the parent-less nodes into the table using the following command.&lt;/font&gt;&lt;/p&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;br /&gt;insert into EmployeeHiearchy&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;(RootBoss, Employee, Boss, Layer)&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;(select employee, employee, boss, 0&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-tab-count:2;"&gt;&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;from Employee&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-tab-count:2;"&gt;&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;where boss is null )&lt;/span&gt;&lt;/b&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;Next, we need to populate each level until no more levels exist.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Once again, the depth is not known so we must loop until the process is complete.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Note that you should provide an exit condition for cyclical references.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Cyclical references amongst three or more nodes are particularly hard to discern with raw sql – using a maximum depth count is one such mechanism.&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;declare @rowsprocessed int&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;set @rowsprocessed = 1&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;declare @layer int&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;set @layer = 1&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;while( @rowsprocessed &amp;gt; 0 )&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;begin&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;insert into EmployeeHierarchy&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-tab-count:2;"&gt;&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;( RootBoss, Employee, Boss, Layer )&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;select&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;eh.RootBoss,&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;e.Employee, e.Boss, @layer&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-tab-count:2;"&gt;&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;from EmployeeHiearchy eh&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-tab-count:2;"&gt;&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;inner join Employee e on&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;eh.Employee = e.Boss&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-tab-count:2;"&gt;&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;where eh.Layer = @layer – 1&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Set @rowsprocessed = @@ROWCOUNT&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Set @currentlevel = @currentlevel + 1&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;end&lt;/span&gt;&lt;/b&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;h2 style="MARGIN:12pt 0in 3pt;"&gt;&lt;em&gt;Summary&lt;/em&gt;&lt;/h2&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;p class="MsoNormal" style="MARGIN:0in 0in 0pt;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;And there you have it.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;A reasonable tree structure processing that is very performant for queries.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; It&amp;#39;s not a one size fits all by any means - k&lt;/span&gt;eep in mind that if you have a constantly updating structure then you need to keep an eye on the cost of updating your edge table.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;While the approach above could be made transactional, the sheer resource cost of that process is prohibitive – especially in real-time conditions.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; But I would contend that this is a good start to understand the problem and evaluate other approaches.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 0pt;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;&lt;span style="mso-spacerun:yes;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 0pt;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;&lt;span style="mso-spacerun:yes;"&gt;Keep in mind that the &amp;quot;edge&amp;quot; table is really a many-to-many resolve table, and as such it can be made to accomodate tree structures that vary by external conditions.&amp;nbsp; This could be the case with certain types of bill of materials problems or medical order components.&amp;nbsp; One good example is a veterinary office where a dental prophy has differing structures based on species - the edge table can typically handle these scenarios through additional fields and multi-column key considerations.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 0pt;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;&lt;span style="mso-spacerun:yes;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 0pt;"&gt;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;&lt;span style="mso-spacerun:yes;"&gt;&lt;/span&gt;When looking for performant transcational base hierarchy, there are better solutions that use other areas of graph theory for a better fit.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Whether you need this extra performance or not, I highly recommend checking out &lt;a class="" href="http://www.amazon.com/Joe-Celkos-SQL-Smarties-Programming/dp/0123693799/ref=pd_bbs_sr_1/102-1697861-8066514?ie=UTF8&amp;amp;s=books&amp;amp;qid=1190925437&amp;amp;sr=8-1"&gt;Joe Celko’s Sql for Smarties&lt;/a&gt; books – he has &lt;a class="" href="http://www.amazon.com/Hierarchies-Smarties-Kaufmann-Management-Systems/dp/1558609202/ref=pd_bbs_sr_2/102-1697861-8066514?ie=UTF8&amp;amp;s=books&amp;amp;qid=1190925437&amp;amp;sr=8-2"&gt;one book dedicated to hierarchical&amp;nbsp;structure processing&lt;/a&gt;.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Celko has been on the ANSI SQL committee just shy of forever and has been writing articles on SQL programming for years. His approach is fundamentally different from sequential-oriented programmers, focusing first on set-based theory and translating that approach to the SQL dialect.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=168785" width="1" height="1"&gt;</description></item><item><title>digging out from under the Inbox</title><link>http://codebetter.com/blogs/steve.hebert/archive/2007/06/01/digging-out-from-under-the-inbox.aspx</link><pubDate>Fri, 01 Jun 2007 08:20:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:163692</guid><dc:creator>shebert</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/steve.hebert/rsscomments.aspx?PostID=163692</wfw:commentRss><comments>http://codebetter.com/blogs/steve.hebert/archive/2007/06/01/digging-out-from-under-the-inbox.aspx#comments</comments><description>&lt;p&gt;It has been a while since my last post - we&amp;#39;ve shipped version&lt;a class="" href="http://about.reuters.com/productinfo/datascopeselect/"&gt; 2.0 of our product&lt;/a&gt; and with ever-increasing momentum, Outlook becomes increasingly difficult to manage due to sheer volume.&amp;nbsp; I have never been particularly fond of Outlook, it leaves a lot of loose ends without a cohesive way to manage it.&lt;/p&gt;
&lt;p&gt;While I&amp;#39;ve read the book &amp;quot;&lt;a class="" href="http://www.amazon.com/s/ref=nb_ss_gw/103-9217311-6484628?url=search-alias%3Daps&amp;amp;field-keywords=getting+things+done&amp;amp;Go.x=10&amp;amp;Go.y=13"&gt;Getting Things Done&lt;/a&gt;&amp;quot; by David Allen, I agree with his strategy of building what he terms a trusted system where every outstanding action is captured so you don&amp;#39;t waste&amp;nbsp;cycles&amp;nbsp;trying to juggle commitments in memory.&amp;nbsp; Part of this strategy is&amp;nbsp;triaging every incoming message (phone/email/etc) until your &amp;#39;inbox&amp;#39; is completely empty and filed away with appropriate recording.&amp;nbsp; It makes sense, but implementing this is time consuming.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;A friend of mine pointed me to &lt;a class="" href="http://www.clearcontext.com/"&gt;Clear Context&lt;/a&gt;.&amp;nbsp; I&amp;#39;ve tried some other outlook plugins that never really worked well or they were so clunky they became annoying (rather than integrating with outlook, they launch a separate window that contains a new interface).&amp;nbsp; Clear Context is different in that it integrates with Outlook 2003 and 2007 seemlessly (I&amp;#39;m currently only running with 2003) .&amp;nbsp; All email processing can be handled with the new buttons they add for automatically creating tasks from email, creating schedule items from email and filing emails.&amp;nbsp; It also auto-files items in threads into folders along with my reponses - no more digging through sent mail.&amp;nbsp; And the Action View is excellent.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;I now have my inbox down to 0 items - everything is filed and captured with minimal effort.&amp;nbsp; That&amp;#39;s a great feeling. In my mind, this is what Outlook should have been in the first place.&amp;nbsp; Their personal edition is free and the professional edition is ~$80.&amp;nbsp; Below are some links to the items including a &amp;quot;Getting Things Done via Clear Context&amp;quot; pdf that is pretty useful.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;Clear Context - Outlook plugin:&lt;u&gt; &lt;/u&gt;&lt;a title="http://www.clearcontext.com/" href="http://www.clearcontext.com/" target="_blank"&gt;http://www.clearcontext.com/&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Getting Things Done - book : &lt;a title="http://www.amazon.com/s/ref=nb_ss_gw/103-9217311-6484628?url=search-alias=aps&amp;amp;field-keywords=getting+things+done&amp;amp;Go.x=10&amp;amp;Go.y=13" href="http://www.amazon.com/s/ref=nb_ss_gw/103-9217311-6484628?url=search-alias%3Daps&amp;amp;field-keywords=getting+things+done&amp;amp;Go.x=10&amp;amp;Go.y=13" target="_blank"&gt;http://www.amazon.com/s/ref=nb_ss_gw/103-9217311-6484628?url=search-alias%3Daps&amp;amp;field-keywords=getting+things+done&amp;amp;Go.x=10&amp;amp;Go.y=13 &lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Here is a 16 page overview of how to implement David&amp;#39;s system using Clear Context and Outlook: &lt;a title="http://www.clearcontext.com/resources/attachments/Using_IMS_for_Outlook_with_GTD.pdf" href="http://www.clearcontext.com/resources/attachments/Using_IMS_for_Outlook_with_GTD.pdf" target="_blank"&gt;http://www.clearcontext.com/resources/attachments/Using_IMS_for_Outlook_with_GTD.pdf &lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;David Allen&amp;#39;s Website is here: &lt;a title="http://www.davidco.com/" href="http://www.davidco.com/" target="_blank"&gt;http://www.davidco.com/&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=163692" width="1" height="1"&gt;</description></item><item><title>XP Media Center lost my second core (once again)</title><link>http://codebetter.com/blogs/steve.hebert/archive/2007/02/25/XP-Media-Center-lost-my-second-core-once-_2800_again_2900_.aspx</link><pubDate>Mon, 26 Feb 2007 01:27:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:159160</guid><dc:creator>shebert</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/steve.hebert/rsscomments.aspx?PostID=159160</wfw:commentRss><comments>http://codebetter.com/blogs/steve.hebert/archive/2007/02/25/XP-Media-Center-lost-my-second-core-once-_2800_again_2900_.aspx#comments</comments><description>&lt;p&gt;In the last 12 hours, &lt;a href="http://codebetter.com/blogs/steve.hebert/archive/2006/09/23/I-found-my-second-core-_2D00_-AMD-X2-and-Media-Center.aspx" target="_blank"&gt;Windows XP Media Center lost my second core again&lt;/a&gt;. I blogged about this a while back where suddenly my dual-core system was only utilizing a single core - apparent in task manager, device manager and general performance.&amp;nbsp; Even with 3GB of RAM, this sent things crawling in Virtual PC.&lt;/p&gt;&lt;p&gt;I&amp;#39;m guessing that some patch was dispatched today (Sunday) and the system stopped recognizing the second core.&amp;nbsp; I wonder if anyone from MS and/or AMD is watching.&amp;nbsp; I reran the driver that I linked to in my blog entry and all was restored. That&amp;#39;s annoying.&lt;/p&gt;&lt;p&gt;I wonder how many dual core users are running 3 cans short of a&amp;nbsp;6 pack without noticing.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=159160" width="1" height="1"&gt;</description></item><item><title>Hiearchical data binding with CSLA and Telerik's radGrid control.</title><link>http://codebetter.com/blogs/steve.hebert/archive/2007/02/25/Hiearchical-data-binding-with-CSLA-and-Telerik_2700_s-radGrid-control_2E00_.aspx</link><pubDate>Sun, 25 Feb 2007 07:05:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:159138</guid><dc:creator>shebert</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/steve.hebert/rsscomments.aspx?PostID=159138</wfw:commentRss><comments>http://codebetter.com/blogs/steve.hebert/archive/2007/02/25/Hiearchical-data-binding-with-CSLA-and-Telerik_2700_s-radGrid-control_2E00_.aspx#comments</comments><description>&lt;p&gt;Following on&amp;nbsp;the &lt;a href="http://codebetter.com/blogs/steve.hebert/archive/2007/02/24/Setting-up-CSLA-databinding-on-a-webpage-using-an-_4000_Register-tag.aspx"&gt;CSLA databinding theme&lt;/a&gt;, I ran into an interesting problem on databinding a parent/child &lt;a href="http://lhotka.net/Area.aspx?id=4" target="_blank"&gt;CSLA&lt;/a&gt; business object relationship with &lt;a href="http://www.telerik.com/" target="_blank"&gt;Telerik&lt;/a&gt;&amp;#39;s radGrid control. The solution is certainly not obvious, but the implementation ends up being pretty straight forward.&lt;/p&gt;&lt;p&gt;First, I set up two distinct CslaDataSource controls - one for each collection.&amp;nbsp; In reality, these are part of the same object hiearchy and I could do this with one control, but I feel it comes out a little cleaner with two.&lt;/p&gt;&lt;p&gt;The key points to&amp;nbsp;consider are this:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Grid: Set the MasterTableView and DetailTable&amp;nbsp;DataSourceIds&amp;nbsp;to their respective CSLA data binding control (dbc).&lt;/li&gt;&lt;li&gt;Grid: Set the MasterTableView&amp;#39;s DateKeyNames property to reflect the unique identifier for the parent row.&lt;/li&gt;&lt;li&gt;DBC Parent: Set up the DataSource_SelectObject to return the business object via the e.BusinessObject parameter.&lt;/li&gt;&lt;li&gt;Grid: Map the ItemCommandEvent to grab parent key using the code snippet below.&lt;/li&gt;&lt;li&gt;DBC Child: Set up the DataSource_SelectObject to return the appropriate child object according to the key obtained in step #4.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Below is the code snippet for the Grid_ItemCommand event mentioned above:&lt;/p&gt;&lt;p&gt;private Guid ActiveParentId = Guid.Empty;&amp;nbsp; //data type may vary for actual implementation.&lt;/p&gt;&lt;p&gt;protected void ..._ItemCommand(...)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; if( e.CommandName == ExpandCollapseCommand )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ActiveParentId = (Guid) e.Item.OwnerTableView.DataKeyValues[e.Item.Index][parentIdName];&lt;br /&gt;}&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=159138" width="1" height="1"&gt;</description></item><item><title>Setting up CSLA databinding on a webpage using an @Register tag</title><link>http://codebetter.com/blogs/steve.hebert/archive/2007/02/24/Setting-up-CSLA-databinding-on-a-webpage-using-an-_4000_Register-tag.aspx</link><pubDate>Sun, 25 Feb 2007 01:18:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:159134</guid><dc:creator>shebert</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/steve.hebert/rsscomments.aspx?PostID=159134</wfw:commentRss><comments>http://codebetter.com/blogs/steve.hebert/archive/2007/02/24/Setting-up-CSLA-databinding-on-a-webpage-using-an-_4000_Register-tag.aspx#comments</comments><description>&lt;p&gt;Setting up databinding using&amp;nbsp;a custom datasource&amp;nbsp;within a page is not always obvious.&amp;nbsp; I&amp;#39;m putting this on my blog as I know I&amp;#39;ll be referring back to it.&lt;/p&gt;&lt;p&gt;&lt;a href="http://lhotka.net/Area.aspx?id=4" target="_blank"&gt;CSLA&lt;/a&gt; is available on &lt;a href="http://lhotka.net/Area.aspx?id=4" target="_blank"&gt;Rocky Lhotka&amp;#39;s site&lt;/a&gt; with downloads, forums and latest version info.&lt;/p&gt;&lt;p&gt;Because databinding is provided through the generic CslaDataSource object in the CSLA framework, there&amp;#39;s a bit of indirection going on in the setup.&amp;nbsp; Rocky&amp;#39;s sample code in ProjectTracker defines the page level references in the web.config file, but I&amp;#39;d rather explicity define them on the page for now.&lt;/p&gt;&lt;p&gt;First, register the Csla assembly in the @ Register tag at the top of your aspx file with:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;lt;%@ Register Assembly=&amp;quot;Csla&amp;quot; Namespace=&amp;quot;Csla.Web&amp;quot; TagPrefix=&amp;quot;csla&amp;quot;&amp;nbsp; %&amp;gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;This allows for a reference to the datasource provider in the framework.&lt;/p&gt;&lt;p&gt;Next, define the actual datasource object on your page that references your business object/collection using the following:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;strong&gt;&amp;lt;csla:CslaDataSource ID=&amp;quot;MyDataSource&amp;quot; runat=&amp;quot;server&amp;quot;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TypeName=&amp;quot;[Company.Product.Layer.Class]&amp;quot;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TypeAssemblyName=&amp;quot;[Assembly Name that implements TypeName]&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TypeSupportsPaging=&amp;quot;False&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TypeSupportsSorting=&amp;quot;False&amp;quot;&amp;nbsp;&amp;gt;&lt;br /&gt;&amp;lt;/csla:CslaDataSource&amp;gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;You&amp;#39;ll need to wire up the OnSelect and other handlers, but Rocky&amp;#39;s book provides excellent examples of this.&lt;/p&gt;&lt;p&gt;&lt;a href="http://lhotka.net/Area.aspx?id=4"&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=159134" width="1" height="1"&gt;</description></item><item><title>XNA Game Studio Express going live on Monday</title><link>http://codebetter.com/blogs/steve.hebert/archive/2006/12/05/XNA-Game-Studio-Express-going-live-on-Monday.aspx</link><pubDate>Wed, 06 Dec 2006 02:14:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:155985</guid><dc:creator>shebert</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/steve.hebert/rsscomments.aspx?PostID=155985</wfw:commentRss><comments>http://codebetter.com/blogs/steve.hebert/archive/2006/12/05/XNA-Game-Studio-Express-going-live-on-Monday.aspx#comments</comments><description>&lt;p&gt;The&lt;a href="http://blogs.msdn.com/xna/archive/2006/12/05/xna-game-studio-express-launch-event-open-house.aspx"&gt; XNA Game Studio Express is launching&lt;/a&gt; on December 11th with an&amp;nbsp;open house on the&amp;nbsp;Redmond campus.&amp;nbsp; Too bad they only give a weeks notice, that would be a fun&amp;nbsp;road trip.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;I haven&amp;#39;t heard yet if they are going to post&amp;nbsp;video of the event on&amp;nbsp;Channel 9.&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=155985" width="1" height="1"&gt;</description></item><item><title>Release parties</title><link>http://codebetter.com/blogs/steve.hebert/archive/2006/11/16/Release-parties.aspx</link><pubDate>Thu, 16 Nov 2006 20:19:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:152682</guid><dc:creator>shebert</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/steve.hebert/rsscomments.aspx?PostID=152682</wfw:commentRss><comments>http://codebetter.com/blogs/steve.hebert/archive/2006/11/16/Release-parties.aspx#comments</comments><description>&lt;p&gt;We are busy finalizing our 4th public release of this year and we&amp;#39;ve decided to go to a Minnesota Wild game (hockey for you non-sports fans).&amp;nbsp; Club level, dinner, and all that stuff.&amp;nbsp; I&amp;#39;m not&amp;nbsp;a huge hockey fan, but live NHL is great to watch.&amp;nbsp; I actually learned the rules of hockey from playing NHL &amp;#39;98.&amp;nbsp; &lt;/p&gt;&lt;p&gt;We&amp;#39;ve done go-karts and other activities in the past, but I&amp;#39;m wondering if anyone has other great ideas for release parties?&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=152682" width="1" height="1"&gt;</description></item><item><title>First Minneapolis/St. Paul Code Camp complete</title><link>http://codebetter.com/blogs/steve.hebert/archive/2006/11/13/First-Minneapolis_2F00_St.-Paul-Code-Camp-complete.aspx</link><pubDate>Mon, 13 Nov 2006 19:12:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:152416</guid><dc:creator>shebert</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/steve.hebert/rsscomments.aspx?PostID=152416</wfw:commentRss><comments>http://codebetter.com/blogs/steve.hebert/archive/2006/11/13/First-Minneapolis_2F00_St.-Paul-Code-Camp-complete.aspx#comments</comments><description>&lt;p&gt;The first Twin Cities CodeCamp went off very well this weekend.&amp;nbsp; There was a wide variety of topics with four presentations running every hour from 9-5 this past Saturday.&amp;nbsp; If you missed it, you missed out!&amp;nbsp; &lt;/p&gt;&lt;p&gt;Keep an eye on the &lt;a href="http://www.twincitiescodecamp.com/TCCC/Default.aspx"&gt;Twin Cities CodeCamp&lt;/a&gt; website for the next event. This would be a great place for an RSS feed - I wonder if anyone is organizing a space where all CodeCamps could host their information and provide such services?&amp;nbsp; That would be very cool.&lt;/p&gt;&lt;p&gt;Congrats to &lt;a href="http://www.jasonbock.net/JB/Default.aspx?blog=entry.67b58623deb94395ae24dedc9c0fb282"&gt;Jason Bock&lt;/a&gt; in doing much of the organizing and pulling this together.&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=152416" width="1" height="1"&gt;</description></item><item><title>Dynamics of Software Development - 2006 Edition</title><link>http://codebetter.com/blogs/steve.hebert/archive/2006/11/09/Dynamics-of-Software-Development-_2D00_-2006-Edition.aspx</link><pubDate>Fri, 10 Nov 2006 04:19:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:152076</guid><dc:creator>shebert</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/steve.hebert/rsscomments.aspx?PostID=152076</wfw:commentRss><comments>http://codebetter.com/blogs/steve.hebert/archive/2006/11/09/Dynamics-of-Software-Development-_2D00_-2006-Edition.aspx#comments</comments><description>&lt;p&gt;I received my copy of the &lt;a href="http://www.amazon.com/Dynamics-Software-Development-Best-Practices/dp/0735623198/sr=8-1/qid=1163135929/ref=pd_bbs_sr_1/102-8140163-4948946?ie=UTF8&amp;amp;s=books"&gt;Dynamics of Software Development 2006 Edition by Jim McCarthy&lt;/a&gt; yesterday and I&amp;#39;m thoroughly impressed.&amp;nbsp; The book comes with a video of the presentation he used to do&amp;nbsp;on his &amp;quot;23 rules of thumb for shipping great software ontime&amp;quot;.&amp;nbsp; The video is worth the price of the book alone.&amp;nbsp; It&amp;#39;s both entertaining and extremely relevant even 11+ years later.&amp;nbsp; &lt;/p&gt;&lt;p&gt;There are several updates to his pre-existing rules that offer better insight.&amp;nbsp; One excellent example is his &amp;quot;Don&amp;#39;t go dark&amp;quot; rule - in this edition he adds that going dark is any code that is not checked in for more than 3 weeks.&amp;nbsp; This and many other points are refinements from the original book.&amp;nbsp; &lt;/p&gt;&lt;p&gt;Many of his rules predate the notions in Agile development by many years - just a few examples...&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Get the product to a shippable state and keep it there.&lt;/li&gt;&lt;li&gt;QA is responsible for articulating the quality and status of the product at any given point in time&lt;/li&gt;&lt;li&gt;Become great at integration - don&amp;#39;t put off deployment testing until the end of the cycle.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;There is new content in the book as well, especially the portion added at the end focused on building a good team environment.&amp;nbsp; I haven&amp;#39;t had a chance to digest this portion yet, but I&amp;#39;m looking forward to it.&lt;/p&gt;&lt;p&gt;Bottom line - if you don&amp;#39;t own this book and you have ANYTHING to do with software development, &lt;a href="http://www.amazon.com/Dynamics-Software-Development-Best-Practices/dp/0735623198/sr=8-1/qid=1163135929/ref=pd_bbs_sr_1/102-8140163-4948946?ie=UTF8&amp;amp;s=books"&gt;buy it&lt;/a&gt;.&amp;nbsp; I &lt;a href="http://codebetter.com/blogs/steve.hebert/archive/2005/07/05/128837.aspx"&gt;blogged about a 2nd Edition of this book that surfaced for a short period last summer on Amazon&lt;/a&gt; as a pre-order, but it just as quietly disappeared. I&amp;#39;m glad McCarthy got it into print. If you own the original book, buy the second book.&amp;nbsp; Just the video itself is worth the price of the book.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=152076" width="1" height="1"&gt;</description></item><item><title>In Search of Stupidity - Volume 2</title><link>http://codebetter.com/blogs/steve.hebert/archive/2006/11/07/In-Search-of-Stupidity-_2D00_-Volume-2.aspx</link><pubDate>Tue, 07 Nov 2006 15:05:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:151829</guid><dc:creator>shebert</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/steve.hebert/rsscomments.aspx?PostID=151829</wfw:commentRss><comments>http://codebetter.com/blogs/steve.hebert/archive/2006/11/07/In-Search-of-Stupidity-_2D00_-Volume-2.aspx#comments</comments><description>&lt;p&gt;I just picked up &amp;quot;&lt;a href="http://www.amazon.com/Search-Stupidity-Twenty-Marketing-Disasters/dp/1590597214/sr=8-2/qid=1162915483/ref=pd_bbs_sr_2/102-8140163-4948946?ie=UTF8&amp;amp;s=books"&gt;In Search of Stupidity: Over Twenty Years of Marketing Disasters Volume 2&lt;/a&gt;&amp;quot; and found myself unable to put it down last night.&amp;nbsp; I wasn&amp;#39;t sure what to expect, I enjoyed the first book but the second book comes off as being more refined.&lt;/p&gt;
&lt;p&gt;The premise of the book starts out as being the anti-thesis to the early 80&amp;#39;s management fad book titled &amp;quot;In Search of Excellence&amp;quot; (no link provided on purpose&amp;nbsp;- it should never be purchased again).&amp;nbsp; The author starts out by picking apart the fawning over high tech companies in this book and examines what really happened in these companies.&amp;nbsp; If you don&amp;#39;t recognize a few of these companies, it&amp;#39;s because they don&amp;#39;t exist anymore.&amp;nbsp; The updated book&amp;nbsp;looks at&amp;nbsp;Google, Siebel and others.&amp;nbsp; I took particular joy in reading about Siebel. (If you have ever had Siebel inflicted upon you, you are most likely nodding your head right now.)&lt;/p&gt;
&lt;p&gt;In the early parts of the book, the basic idea is that company success is inversely related to stupidity.&amp;nbsp;&amp;nbsp;This is an enjoyable read.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=151829" width="1" height="1"&gt;</description></item></channel></rss>