<?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&amp;#39;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 2007 (Build: 20416.853)</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>2</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;img src="http://codebetter.com/aggbug.aspx?PostID=183712" width="1" height="1"&gt;</description></item><item><title>Why I made the switch to Microsoft and Expression Web</title><link>http://codebetter.com/blogs/steve.hebert/archive/2008/08/29/why-i-made-the-switch-or-writing-good-web-code.aspx</link><pubDate>Sat, 30 Aug 2008 00:43:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:182400</guid><dc:creator>shebert</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/steve.hebert/rsscomments.aspx?PostID=182400</wfw:commentRss><comments>http://codebetter.com/blogs/steve.hebert/archive/2008/08/29/why-i-made-the-switch-or-writing-good-web-code.aspx#comments</comments><description>&lt;span style="FONT-FAMILY:&amp;#39;Calibri&amp;#39;,&amp;#39;sans-serif&amp;#39;;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font size="3"&gt;As I was making the move to Microsoft and the Expression Web team, a number of people asked what drew me to Expression Web.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;A notion that I believe in with software is that over time, software quality decreases if you are not paying ample attention to it – software entropy.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;I think this is something that everyone who has been on a software project over time knows.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;With things like DI, Unit Testing and Continuous Integration, we incorporate tools that&amp;nbsp;promote code quality and even set bars before checkins occur.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;This keeps everyone’s eyes on quality based on the checks being done during build time.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Now why can’t we have this with our website design?&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;This is a key area where Expression Web fit into the picture for me because Expression Web offers up a series of reports for CSS, accessibility and compatibility.&lt;/font&gt;&lt;/span&gt; 
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Calibri&amp;#39;,&amp;#39;sans-serif&amp;#39;;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font size="3"&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Calibri&amp;#39;,&amp;#39;sans-serif&amp;#39;;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font size="3"&gt;&lt;strong&gt;CSS&lt;/strong&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Calibri&amp;#39;,&amp;#39;sans-serif&amp;#39;;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font size="3"&gt;Good design and up-to-date CSS takes a lot of time to get it right – not only on the first release but on subsequent releases.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Expression Web is really focused first and foremost on &lt;a class="" href="http://www.webstandards.org/about/mission/"&gt;standards based design&lt;/a&gt; – and that’s a great place to start.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;To my earlier point about software quality decreasing over time if people aren’t paying attention to it, Expression Web performs quality checks on your CSS that you can run at any time.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;If you have styles that are no longer being used or they are causing problems due to composition, you get notified right away instead of finding out through diagnosing an edge-case problem on one of your target browsers.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-FAMILY:&amp;#39;Calibri&amp;#39;,&amp;#39;sans-serif&amp;#39;;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font size="3"&gt;&lt;span style="mso-spacerun:yes;"&gt;&lt;img style="WIDTH:274px;HEIGHT:243px;" height="243" src="http://codebetter.com/photos/shebert/images/182399/274x243.aspx" width="274" alt="" /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Calibri&amp;#39;,&amp;#39;sans-serif&amp;#39;;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt; 
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Calibri&amp;#39;,&amp;#39;sans-serif&amp;#39;;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font size="3"&gt;&lt;strong&gt;Compatibility&lt;/strong&gt; – Again, while Expression Web takes a standards-focus design approach, you can tell Expression Web that you are interested in particular targets – say CSS 2.1 and XHTML 1.0 Strict.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;As with the CSS Reports, you receive errors and warnings that take you to code that is in violation.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Calibri&amp;#39;,&amp;#39;sans-serif&amp;#39;;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font size="3"&gt;&lt;span style="mso-spacerun:yes;"&gt;&lt;img style="WIDTH:425px;HEIGHT:227px;" height="227" src="http://codebetter.com/photos/shebert/images/182398/425x227.aspx" width="425" alt="" /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-FAMILY:&amp;#39;Calibri&amp;#39;,&amp;#39;sans-serif&amp;#39;;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;font size="3"&gt;&lt;strong&gt;Accessibility&lt;/strong&gt; – Good website design requires making sure that the site is accessible to all people.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;So making sure that images are properly tagged for screen readers and that dynamic menus degrade gracefully is incredibly important in this line of work.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Just recently, our locally headquartered &lt;a class="" href="http://www.sitepoint.com/blogs/2008/08/29/target-settles-accessibility-lawsuit-for-6-million/"&gt;Target Corp settled a lawsuit over accessibility&lt;/a&gt;. Expression Web floats errors and warnings about accessibility that you can run at any time on the site you are creating.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;And whether you are getting version 1.0 of your site ready for the world or you are pushing version 3.3 out the door, being able to answer questions about accessibility is something&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;that benefits your product, your customers and their customers.&lt;/font&gt;&lt;/span&gt;&lt;font face="Batang" size="3"&gt;&amp;nbsp;&lt;/font&gt; 
&lt;p&gt;&lt;img src="http://codebetter.com/photos/shebert/images/182397/425x248.aspx" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;So that&amp;#39;s one big reason why I made the jump.&amp;nbsp; For me, I see an exciting product addressing very real needs and exciting directions for the future!&lt;/p&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=182400" width="1" height="1"&gt;</description></item><item><title>Moving to Microsoft</title><link>http://codebetter.com/blogs/steve.hebert/archive/2008/08/18/moving-to-microsoft.aspx</link><pubDate>Mon, 18 Aug 2008 15:00:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:182063</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=182063</wfw:commentRss><comments>http://codebetter.com/blogs/steve.hebert/archive/2008/08/18/moving-to-microsoft.aspx#comments</comments><description>&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;During the past month, I have accepted a new position at &lt;a class="" href="http://www.microsoft.com/en/us/default.aspx"&gt;Microsoft&lt;/a&gt;.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;I am now working on the &lt;a class="" href="http://www.microsoft.com/expression/products/overview.aspx?key=web"&gt;Expression Web&lt;/a&gt; project that is part of the &lt;a class="" href="http://www.microsoft.com/expression/products/Overview.aspx?key=studio"&gt;Expression Studio&lt;/a&gt; product suite.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;It’s an exciting time as I am learning my way around the team, product and company.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; Expression Web is an excellent web content design tool - from Standards Compliance, to developing cleaner CSS and being able to tie it in with ASP.NET and PHP all make this tool a must-have.&lt;/span&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;So what is it like to work at Microsoft? It’s awesome – getting dialed in to the team here and getting to know different groups around the company is great.&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; After spending a few weeks in Redmond at Building 42, &lt;/span&gt;I am now working in the Minneapolis, Minnesota&amp;nbsp;development office with a growing team.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;What does this change in my blog and projects – namely &lt;a class="" href="http://www.codeplex.com/dotMath/Wiki/View.aspx?title=Getting%20Started%20-%20How%20to%20use%20dotMath"&gt;dotMath&lt;/a&gt;?&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;Nothing really - dotMath licensing stays the same and I will continue blogging&amp;nbsp;here at CodeBetter.&amp;nbsp;&lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;I am looking to resume blogging and focusing on coding issues once again &lt;span style="mso-spacerun:yes;"&gt;with a&lt;/span&gt;&amp;nbsp;whole new set of blog content!&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=182063" 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;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;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;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. A good&amp;nbsp;relational setup between your load-balancer/encryptor&amp;nbsp;setup should&amp;nbsp;limit the change need to http-&amp;gt;https, but this implementation also offers other flexibility as well.&amp;nbsp; I just can&amp;#39;t think of a good use-case right now.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;When running with a front-end encryption appliance for offloading the cpu cost of SSL, the webservers themselves typically run on the http/port 80/non-encrypted protocol.&amp;nbsp; Since .Net senses this, the WSDL is generated with &amp;quot;http://&amp;quot; prefixes in the soap:address which is incorrect for consumers of the service.&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;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;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;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;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 them