<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>LINQ for SQL</title>
        <link>http://www.shanghai-software.com/blog/category/13.aspx</link>
        <description>LINQ for SQL</description>
        <language>en-AU</language>
        <copyright>Ben Kloosterman</copyright>
        <generator>Subtext Version 2.1.0.5</generator>
        <item>
            <title>LINQ for SQL unit testing Part2</title>
            <link>http://www.shanghai-software.com/blog/archive/2009/01/15/linq-for-sql-unit-testing-part2.aspx</link>
            <description>&lt;p&gt;I'm not really sure whether the benefits are worth it unless you need very high quality code and for larger applications.   I'm not sure why i feel this and whether this is due to compartmentalizing the LINQ code or whether its just TDD on LINQ code which can be tested via a test DB i suspect its the TDD.  &lt;/p&gt;
&lt;p&gt;Still storing all the sql in the various repositories is a plus.&lt;/p&gt;
&lt;font size="2"&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt;---------------------------------------------------------------------------------------------------------------------------&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;internal&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;class&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;ProvinceRepositry&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; : &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;RepositryBase&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Province&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;gt;, &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;IProvinceRepositry&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;{&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; ProvinceRepositry()&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;base&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;ProvinceUnitOfWork&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;())&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; ProvinceRepositry(&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;IUnitOfWork&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Province&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;gt; work)&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;base&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;(work)&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;#region&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; IProvinceRepositry Members&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;ProvinceCollection&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; GetWorld(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; worldname)&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;throw&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; System.&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;NotImplementedException&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;();&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;ProvinceCollection&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; GetWorld()&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;throw&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; System.&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;NotImplementedException&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;();&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Province&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; Get(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;int&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; id)&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;throw&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; System.&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;NotImplementedException&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;();&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; Update(&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Province&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; prov)&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Guard&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;.ArgumentNotNull(prov, &lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&lt;font color="#a31515" size="2"&gt;"PROVINCE"&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;); &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; Create(&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Province&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; prov)&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Guard&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;.ArgumentNotNull(prov, &lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&lt;font color="#a31515" size="2"&gt;"PROVINCE"&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;); &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;throw&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; System.&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;NotImplementedException&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;();&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2" /&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;: &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;: &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;#endregion&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;-------------------------------------------------------------------------------------------------------------------------&lt;/p&gt;
&lt;font size="2"&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;#region&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;context.SubmitChanges(); &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;#endregion&lt;/p&gt;
&lt;p&gt;#region&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;context.Dispose();&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;#endregion&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;internal&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;class&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;ProvinceUnitOfWork&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; :&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;UnitOfWorkBase&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Province&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;gt;, &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;IUnitOfWork&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Province&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;DataContext&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; context;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; ProvinceUnitOfWork()&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;this&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;.context = &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;DataContextFactory&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;DataClassesDataContext&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;gt;.GetThreadScopedDataContext(); ; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2" /&gt;&lt;/font&gt;&lt;font size="2"&gt; IUnitofWork&amp;lt;World&amp;gt; Members&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;override&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;bool&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; ReadOnly { &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;get&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; { &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; !context.ObjectTrackingEnabled; } &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;set&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; { context.ObjectTrackingEnabled = !&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;value&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;; } }&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;override&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; SubmitChanges()&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2" /&gt;&lt;/font&gt;&lt;font size="2"&gt; IDisposable Members&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;override&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; Dispose()&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2" /&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;internal&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;interface&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;IProvinceRepositry&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;{&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;ProvinceCollection&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; GetWorld(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; worldname);&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;ProvinceCollection&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; GetWorld();&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Province&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; Get(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;int&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; id);&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; Update(&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Province&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; prov);&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; Create(&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Province&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; prov); &lt;/font&gt;&lt;img src="http://www.shanghai-software.com/blog/aggbug/15.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ben Kloosterman</dc:creator>
            <guid>http://www.shanghai-software.com/blog/archive/2009/01/15/linq-for-sql-unit-testing-part2.aspx</guid>
            <pubDate>Wed, 14 Jan 2009 16:38:38 GMT</pubDate>
            <wfw:comment>http://www.shanghai-software.com/blog/comments/15.aspx</wfw:comment>
            <comments>http://www.shanghai-software.com/blog/archive/2009/01/15/linq-for-sql-unit-testing-part2.aspx#feedback</comments>
            <wfw:commentRss>http://www.shanghai-software.com/blog/comments/commentRss/15.aspx</wfw:commentRss>
            <trackback:ping>http://www.shanghai-software.com/blog/services/trackbacks/15.aspx</trackback:ping>
        </item>
        <item>
            <title>LINQ for SQL unit testing Part1</title>
            <link>http://www.shanghai-software.com/blog/archive/2009/01/15/linq-for-sql-unit-testing-part1.aspx</link>
            <description>&lt;p&gt;Ian Cooper had some nice articles on how to do unit testing , i have implemented his code and ideas ( shown below) .&lt;/p&gt;
&lt;p&gt;See Part 2 for some Business code &lt;/p&gt;
&lt;p&gt;&lt;font face="Arial" /&gt;&lt;/p&gt;
&lt;font size="2"&gt;
&lt;div /&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div /&gt;
&lt;div /&gt;
&lt;div /&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div&gt;impl = source;&lt;/div&gt;
&lt;div&gt;queryableImpl = impl.AsQueryable();&lt;/div&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div&gt;impl.Add(item);&lt;/div&gt;
&lt;div&gt;queryableImpl = impl.AsQueryable();&lt;/div&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;#region&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div&gt;impl.Remove(item);&lt;/div&gt;
&lt;div&gt;queryableImpl = impl.AsQueryable();&lt;/div&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div&gt;impl.RemoveAll(MatchWithContainer);&lt;/div&gt;
&lt;div&gt;queryableImpl = impl.AsQueryable();&lt;/div&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;#endregion&lt;/div&gt;
&lt;div&gt;#region&lt;/div&gt;
&lt;div&gt;System.Collections.&lt;/div&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;#endregion&lt;/div&gt;
&lt;div&gt;#region&lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;#endregion&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;&lt;font size="2"&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;interface&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;IDataSource&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;T&amp;gt; : &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;IQueryable&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;T&amp;gt;, &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;IEnumerable&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;T&amp;gt;,&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;ITable&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;, &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;IQueryProvider&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;font size="2"&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;} &lt;/p&gt;
&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;
&lt;p&gt;public&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;interface&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;IUnitOfWork&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;T&amp;gt; :&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;IDisposable&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;ILINQDataSource&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;T&amp;gt; DataSource{ &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;get&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;set&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;; } &lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt;//table&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt;// bool ReadOnly { get; set; }&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; SubmitChanges(); &lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt;// only call for inserts OR when all work is done &lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font size="2"&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;unitOfWork = work; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;font size="2" /&gt;&lt;/p&gt;
&lt;font size="2"&gt;&lt;font size="2"&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;#region&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;dataSource = &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;#region&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;abstract&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;class&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;UnitOfWorkBase&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;T&amp;gt; : &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;IUnitOfWork&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;T&amp;gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;ILINQDataSource&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;T&amp;gt; dataSource; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2" /&gt;&lt;/font&gt;&lt;font size="2"&gt; IUnitofWork&amp;lt;T&amp;gt; Members&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;ILINQDataSource&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;T&amp;gt; DataSource&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;get&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; dataSource;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;set&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;value&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; ;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;abstract&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;bool&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; ReadOnly { &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;get&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;set&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;; }&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;abstract&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; SubmitChanges();&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;#endregion&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; IDisposable Members&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;abstract&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; Dispose();&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;#endregion&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;class&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;RepositryBase&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;T&amp;gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;where&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; T : &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;class&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;protected&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;IUnitOfWork&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;T&amp;gt; unitOfWork;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; RepositryBase(&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;IUnitOfWork&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;T&amp;gt; work) &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Guard&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;.ArgumentNotNull(work, &lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&lt;font color="#a31515" size="2"&gt;"work"&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;);&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt;//public IQueryable&amp;lt;T&amp;gt; T&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt;//{&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt;// get { return gameSettings; }&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt;// set { gameSettings = value; }&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt;//} &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;}&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;interface&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;ILINQDataSource&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;T&amp;gt; : &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;IQueryable&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;T&amp;gt;, &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;IEnumerable&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;T&amp;gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; Add(T item);&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; Attach(T item);&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; Remove(T item);&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; RemoveAll(&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;IEnumerable&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;T&amp;gt; items);&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;
&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;class&lt;/font&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;MemoryDataSource&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;T&amp;gt; : &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;ILINQDataSource&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;T&amp;gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;List&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;T&amp;gt; impl;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;IQueryable&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;T&amp;gt; queryableImpl;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; MemoryDataSource(&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;List&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;T&amp;gt; source)&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; MemoryDataSource(): &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;this&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;List&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;T&amp;gt;())&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; Add(T item)&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt;//public IQueryable&amp;lt;S&amp;gt; CreateQuery&amp;lt;S&amp;gt;(Expression expression)&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt;//{&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt;// return queryableImpl..CreateQuery&amp;lt;S&amp;gt;(expression);&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt;//}&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;IEnumerator&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;T&amp;gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;IEnumerable&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;T&amp;gt;.GetEnumerator()&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; impl.GetEnumerator();&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2" /&gt;&lt;/font&gt;&lt;font size="2"&gt; ITable&amp;lt;T&amp;gt; Members&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; Attach(T item)&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; Remove(T item)&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; RemoveAll(&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;IEnumerable&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;T&amp;gt; items)&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;internal&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;bool&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; MatchWithContainer(T item)&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; impl.Contains(item);&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2" /&gt;&lt;/font&gt;&lt;font size="2"&gt; IEnumerable Members&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;IEnumerator&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; System.Collections.&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;IEnumerable&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;.GetEnumerator()&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; impl.GetEnumerator();&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2" /&gt;&lt;/font&gt;&lt;font size="2"&gt; IQueryable Members&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; System.&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Type&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; ElementType&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;get&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; { &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; queryableImpl.ElementType; }&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Expression&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; Expression&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;get&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; { &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; queryableImpl.Expression; }&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;IQueryProvider&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; Provider&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;get&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; { &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; queryableImpl.Provider; }&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2" /&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;img src="http://www.shanghai-software.com/blog/aggbug/14.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ben Kloosterman</dc:creator>
            <guid>http://www.shanghai-software.com/blog/archive/2009/01/15/linq-for-sql-unit-testing-part1.aspx</guid>
            <pubDate>Wed, 14 Jan 2009 16:25:59 GMT</pubDate>
            <wfw:comment>http://www.shanghai-software.com/blog/comments/14.aspx</wfw:comment>
            <comments>http://www.shanghai-software.com/blog/archive/2009/01/15/linq-for-sql-unit-testing-part1.aspx#feedback</comments>
            <wfw:commentRss>http://www.shanghai-software.com/blog/comments/commentRss/14.aspx</wfw:commentRss>
            <trackback:ping>http://www.shanghai-software.com/blog/services/trackbacks/14.aspx</trackback:ping>
        </item>
        <item>
            <title>LINQ for SQL thread affinity Data context</title>
            <link>http://www.shanghai-software.com/blog/archive/2009/01/15/linq-for-sql-thread-affinity-data-context.aspx</link>
            <description>&lt;p&gt;&lt;a href="http://www.west-wind.com/Weblog/default.aspx"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;From &lt;font face="Arial"&gt;&lt;a href="http://www.cnblogs.com/sunrack/articles/1130866.html"&gt;http://www.cnblogs.com/sunrack/articles/1130866.html&lt;/a&gt; , for services we use mainly Thread Context ( the original allows a static context as well ). &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Thread context is very usefull for services.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;font size="2"&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;TDataContext result = (TDataContext)&lt;/div&gt;
&lt;div&gt;SetOptions(result); &lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;TDataContext result = (TDataContext)&lt;/div&gt;
&lt;div&gt;SetOptions(result);&lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;options.LoadWith&amp;lt;&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;context.LoadOptions = options;&lt;/div&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;key = &lt;/div&gt;
&lt;div /&gt;
&lt;div /&gt;
&lt;div /&gt;
&lt;div&gt;context = &lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;context = GetDataContext();&lt;/div&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;context = GetDataContext(ConnectionString);&lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;threadData = &lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div /&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div /&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&lt;font size="2"&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;summary&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; This class provides several static methods for loading DataContext objects &lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; in a variety of ways. You can load the data context as normal one new instance&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; at a time, or you can choose to use one of the scoped factory methods that&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; can scope the DataContext to a WebRequest or a Thread context (in a WinForm app&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; for example).&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; &lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; Using scoped variants can be more efficient in some scenarios and allows passing&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; a DataContext across multiple otherwise unrelated components so that the change&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; context can be shared. &lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;/summary&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;class&lt;/font&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;DataContextFactory&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;TDataContext&amp;gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;where&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; TDataContext : &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;DataContext&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;, &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;()&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;summary&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; Creates a new Data Context for a specific DataContext type with a connection string&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; &lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; Provided merely for compleness sake here - same as new YourDataContext()&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;/summary&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;typeparam name="TDataContext"&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;param name="connectionString"&amp;gt;&amp;lt;/param&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;static&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; TDataContext GetDataContext(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; connectionString)&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Type&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; t = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;typeof&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;(TDataContext);&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Activator&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;.CreateInstance(t, connectionString);&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; result; &lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;summary&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; Creates a new Data Context for a specific DataContext type&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; &lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; Provided merely for compleness sake here - same as new YourDataContext()&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;static&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; TDataContext GetDataContext()&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Type&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; t = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;typeof&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;(TDataContext);&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Activator&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;.CreateInstance(t);&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; result; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;static&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; SetOptions(TDataContext context)&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;DataLoadOptions&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; options = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;DataLoadOptions&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;();&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Force&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;gt;(Force =&amp;gt; Force.Characters); &lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt;//add more rows&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;summary&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; Creates a Thread Scoped DataContext object that can be reused.&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; The DataContext is stored in Thread local storage.&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;/summary&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;typeparam name="TDataContext"&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;param name="key"&amp;gt;&amp;lt;/param&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;static&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; TDataContext GetThreadScopedDataContext()&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; (TDataContext)GetThreadScopedDataContextInternal(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;, &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;);&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;summary&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; Creates a Thread Scoped DataContext object that can be reused.&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; The DataContext is stored in Thread local storage.&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;/summary&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;typeparam name="TDataContext"&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;param name="key"&amp;gt;&amp;lt;/param&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;static&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; TDataContext GetThreadScopedDataContext(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; key)&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; (TDataContext)GetThreadScopedDataContextInternal(key, &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;);&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;summary&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; Creates a Thread Scoped DataContext object that can be reused.&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; The DataContext is stored in Thread local storage.&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;/summary&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;typeparam name="TDataContext"&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;param name="key"&amp;gt;&amp;lt;/param&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;static&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;object&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; GetThreadScopedDataContextInternal( &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; key, &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; ConnectionString)&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;if&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; (key == &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;)&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&lt;font color="#a31515" size="2"&gt;"__WRSCDC_"&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; + &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Thread&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;.CurrentContext.ContextID.ToString();&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;LocalDataStoreSlot&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; threadData = &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Thread&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;.GetNamedDataSlot(key);&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;object&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; context = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;if&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; (threadData != &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;)&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Thread&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;.GetData(threadData);&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;if&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; (context == &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;)&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;if&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; (ConnectionString == &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;)&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;else&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;if&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; (context != &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;)&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;if&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; (threadData == &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;)&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Thread&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;.AllocateNamedDataSlot(key);&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Thread&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;.SetData(threadData, context);&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; context;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;summary&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; Returns either Web Request scoped DataContext or a Thread scoped&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; request object if not running a Web request (ie. HttpContext.Current)&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; is not available.&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;/summary&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;typeparam name="TDataContext"&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;param name="key"&amp;gt;&amp;lt;/param&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;param name="ConnectionString"&amp;gt;&amp;lt;/param&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;static&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; TDataContext GetScopedDataContext(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; key, &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; connectionString)&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt;//if (HttpContext.Current != null)&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt;// return (TDataContext)GetWebRequestScopedDataContextInternal(typeof(TDataContext), key, connectionString);&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; (TDataContext)GetThreadScopedDataContextInternal( key, connectionString);&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;summary&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; Returns either Web Request scoped DataContext or a Thread scoped&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; request object if not running a Web request (ie. HttpContext.Current)&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; is not available.&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;/summary&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;typeparam name="TDataContext"&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;param name="key"&amp;gt;&amp;lt;/param&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;static&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; TDataContext GetScopedDataContext(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; key)&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt;//if (HttpContext.Current != null)&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt;// return (TDataContext)GetWebRequestScopedDataContextInternal(typeof(TDataContext), key, null);&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; (TDataContext)GetThreadScopedDataContextInternal( key, &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;);&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;summary&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; Returns either Web Request scoped DataContext or a Thread scoped&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; request object if not running a Web request (ie. HttpContext.Current)&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt; is not available.&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;/summary&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;typeparam name="TDataContext"&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;param name="key"&amp;gt;&amp;lt;/param&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;static&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; TDataContext GetScopedDataContext()&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt;//if (HttpContext.Current != null)&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt;// return (TDataContext)GetWebRequestScopedDataContextInternal(typeof(TDataContext), null, null);&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; (TDataContext)GetThreadScopedDataContextInternal( &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;, &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;img src="http://www.shanghai-software.com/blog/aggbug/13.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ben Kloosterman</dc:creator>
            <guid>http://www.shanghai-software.com/blog/archive/2009/01/15/linq-for-sql-thread-affinity-data-context.aspx</guid>
            <pubDate>Wed, 14 Jan 2009 16:01:21 GMT</pubDate>
            <wfw:comment>http://www.shanghai-software.com/blog/comments/13.aspx</wfw:comment>
            <comments>http://www.shanghai-software.com/blog/archive/2009/01/15/linq-for-sql-thread-affinity-data-context.aspx#feedback</comments>
            <wfw:commentRss>http://www.shanghai-software.com/blog/comments/commentRss/13.aspx</wfw:commentRss>
            <trackback:ping>http://www.shanghai-software.com/blog/services/trackbacks/13.aspx</trackback:ping>
        </item>
        <item>
            <title>OO with services </title>
            <link>http://www.shanghai-software.com/blog/archive/2009/01/14/oo-with-services.aspx</link>
            <description>&lt;p&gt;Are OO code and SOA diametrically opposed ? In a lot of ways this is true services tend to produce very anemic object models however this merely reduces reuse which is a myth in OO for the majority anyway . &lt;/p&gt;
&lt;p&gt;However services have a unique but familiar problem . The contract of the service is critical it needs to be designed for &lt;/p&gt;
&lt;p&gt; - The ease of use of the client  &lt;/p&gt;
&lt;p&gt;- For performance  ( ie chunky calls , many small calls can bring many services down to its needs) &lt;/p&gt;
&lt;p&gt;- To be upgradeable and allow backward compatibility.&lt;/p&gt;
&lt;p&gt;- Compatible with an XML schema ( eg generics and interfaces create problems) &lt;/p&gt;
&lt;p&gt;- Best to be compatible with WS standards and non &lt;a rel="" href="http://74.55.152.210/blog/WCF" title="WCF"&gt;Windows Communication Foundation&lt;/a&gt; clients ( eg nullable datetime ,  no char , long etc ) &lt;/p&gt;
&lt;p&gt;- Only sub object and collections needed for this call need to be propagated which is not all the objects and collections a object may contain.  eg Order GetOrder(..) may contain OrderItems which contain Products but no more information about the product such as supplier etc . This is best described as truncated trees. &lt;/p&gt;
&lt;p&gt;( see how to write a good contract) &lt;/p&gt;
&lt;p&gt;This is dramatically different from an OO structure  where ease of use is not high on the list else we would all be using statics , however its very similar to a relational database and its structure. &lt;/p&gt;
&lt;p&gt;Does this mean services are similar to databases ( eg Procedural Programming)  ? From the outside yes and smaller services probably should remain Procedural and non OO . (A good example is in the LINQ and services article)&lt;/p&gt;
&lt;p&gt;However larger services should retain a significant OO core with a focus on code quality , testability and maintainability however this requires a reverse ORM which maps from the messages to the internal logic.  Microsofts P&amp;amp;P Web service factory includes converterts exactly for this purposes and its a good pattern to follow. &lt;/p&gt;
&lt;p&gt;Even in small services when mapping from a  DB to messages there is a case for such a conversion layer ( and DTOs)  . Take the case of LINQ for sql if you add a member to  a DB table for some new functionality meant to be visible to a select group do you want every client to now have this information in the data sent down  ?  If custom message contracts were used only the new operation and contract used by the select group would get the new information however all the logic would be common ( just the privileged data would not be copied to contract) . If custom message contracts are not used the team would be forced to create a new schema copy of the data for the same table which would be identical  except for the one member as can be seen over time this would reduce maintainability of the service . &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;img src="http://www.shanghai-software.com/blog/aggbug/12.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ben Kloosterman</dc:creator>
            <guid>http://www.shanghai-software.com/blog/archive/2009/01/14/oo-with-services.aspx</guid>
            <pubDate>Wed, 14 Jan 2009 15:33:15 GMT</pubDate>
            <wfw:comment>http://www.shanghai-software.com/blog/comments/12.aspx</wfw:comment>
            <comments>http://www.shanghai-software.com/blog/archive/2009/01/14/oo-with-services.aspx#feedback</comments>
            <wfw:commentRss>http://www.shanghai-software.com/blog/comments/commentRss/12.aspx</wfw:commentRss>
            <trackback:ping>http://www.shanghai-software.com/blog/services/trackbacks/12.aspx</trackback:ping>
        </item>
        <item>
            <title>How to write a good service contracts</title>
            <link>http://www.shanghai-software.com/blog/archive/2009/01/14/how-to-write-a-good-service-contract.aspx</link>
            <description>&lt;p&gt;... not hand craft wsdl&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Custom messages reduce churn and change in the contract&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Lets say you have this datacontract &lt;br /&gt;
&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;[DataContract]&lt;/p&gt;
&lt;p&gt;public class WorkEntry&lt;/p&gt;
&lt;p&gt;{&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;[DataMember]&lt;/p&gt;
&lt;p&gt;public DateTime StartTime;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;[DataMember]&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;public TimeSpan Duration;&lt;/p&gt;
&lt;p&gt;[DataMember]&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;public string User;&lt;/p&gt;
&lt;p&gt;[DataMember]&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;public string CostCentre;&lt;/p&gt;
&lt;p&gt;[DataMember]&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;string Comments;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;What can go wrong here ? Using public fields is good , its tight and if you need to do custom things you can refactor it easily.  I think there is nothing really wrong here however if this is a business object also i would be concerned. &lt;br /&gt;
&lt;/p&gt;
 The big gotcha maybe DateTime  , lets say you have some other systems in your company that use Java . Now Java systems use a nullable DateTime and can send null ( and DateTime.Min can become null if emit default values is false) causing all sorts of issues . Management decides YOU must change however you have used this as a business object through your app . You can change the DateTime to DateTime? However there are a large amount of implication to your application in now having to deal with possible null values - including the SQL server and DB and hence what is a trivial change requires pretty a lot of work and risk and hence testing ( note TDD or unit testing here do not help and make it worse as the unit tests also have to change) . &lt;br /&gt;
&lt;br /&gt;
The problem here comes from using your DTO ( data transfer object eg message /DataContract) as your business object. I think this should be avoided in all cases where the service is non trivial. In Trivial services its easy enough to write a new service or make the changes and hence using the business object as the message is ok. &lt;br /&gt;
&lt;br /&gt;
Avoid .NET specifics especially&lt;br /&gt;
&lt;ul&gt;
    &lt;li&gt;non int integer types &lt;/li&gt;
    &lt;li&gt;char  &lt;/li&gt;
    &lt;li&gt;generics ( not that it works) &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;serializing interfaces &lt;/li&gt;
    &lt;li&gt;inheritance&lt;/li&gt;
&lt;/ul&gt;
Ultimately messages are serialized as XML and forcing a object model onto it will always result in difficulties and leaky abstractions for the domain.  The solution is simple DONT let WCF and your communications contaminate your object models use the DTO(Data Transfer) pattern.&lt;br /&gt;
&lt;br /&gt;
see DTO pattern.&lt;br /&gt;&lt;img src="http://www.shanghai-software.com/blog/aggbug/11.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ben Kloosterman</dc:creator>
            <guid>http://www.shanghai-software.com/blog/archive/2009/01/14/how-to-write-a-good-service-contract.aspx</guid>
            <pubDate>Wed, 14 Jan 2009 15:10:47 GMT</pubDate>
            <wfw:comment>http://www.shanghai-software.com/blog/comments/11.aspx</wfw:comment>
            <comments>http://www.shanghai-software.com/blog/archive/2009/01/14/how-to-write-a-good-service-contract.aspx#feedback</comments>
            <wfw:commentRss>http://www.shanghai-software.com/blog/comments/commentRss/11.aspx</wfw:commentRss>
            <trackback:ping>http://www.shanghai-software.com/blog/services/trackbacks/11.aspx</trackback:ping>
        </item>
        <item>
            <title>LINQ for SQL and reattaching objects in nTier scenarios</title>
            <link>http://www.shanghai-software.com/blog/archive/2009/01/14/linq-for-sql-and-reattaching-objects-in-ntier-scenarios.aspx</link>
            <description>&lt;p&gt;One of the issues that keeps cropping up is LINQ for SQLs support for nTier scenarios and having to reattach the object to the DataContext. &lt;/p&gt;
&lt;p&gt;However this problem is exhibited by all ORMs in nTier scenarios ( though not in web sites) and  you basically have 2 choices &lt;/p&gt;
&lt;p&gt;- refetch the object from cache/DB and replay all changes to see what has changed then you can craft a custom Update to just change the items changed. &lt;/p&gt;
&lt;p&gt;- update all fields in the DB. &lt;/p&gt;
&lt;p&gt;While the 2nd method is easier the first is more efficient especially when you consider that it is very likely that the object is still in a cache. &lt;/p&gt;
&lt;p&gt;In both cases a row version/timestamp is normally required for concurrency .&lt;/p&gt;
&lt;p&gt; ProcessOrder ( Order order) &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;var orderDB = ThreadDataContext.Context; //get dataContext&lt;br /&gt;
//Products is the table we draged and dropped in the dbml designer&lt;br /&gt;
var _oldOrder = (from _orders in order.Orders&lt;/font&gt;&lt;font face="Arial"&gt;           &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;select _order where _order.id =  order.id).Single();&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt; &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;//note as you have the old order and new order you can apply some logic , this is much more efficient than doing it in a db &lt;/p&gt;
&lt;p&gt;if ( &lt;font face="Arial"&gt;_oldOrder.IsFinalized())&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;   throw new InvalidOperationException("Finalized order cant be changed");&lt;/p&gt;
&lt;p&gt;if ( _OldOrder.RowVer != _order.RowVer) &lt;/p&gt;
&lt;p&gt;   throw new ConcurrencyException("Order already Changed") ;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;//update the fields&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;_oldOrder .Number = order.Number; &lt;br /&gt;
&lt;font face="Arial"&gt;_oldOrder .CustomerId = order.CustomerId; &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;// etc ...&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;new BLL.OrderProcessor().Process(&lt;font face="Arial"&gt;_oldOrder);  //process &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;You could use reflection to automate the copying and then the new order would just overwrite the previous order but this has 2 issues&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;It would be slow &lt;/li&gt;
    &lt;li&gt;It would allow the client  to trash the servers object by serializing  on top of it . &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is also worth noting for medium and large services you are likely to have an internal object module and code to convert from messages to internal code anyway ( see OO with services article) &lt;/p&gt;
&lt;p&gt;I think fetching the old order is good business practice anyway and stops issues like a client bug updatting a service and trashing a fulfilled order with a new one .  Fetching the old order allows you to uphold one of the SOA tennats/rules that a service should never trust a client .&lt;/p&gt;
&lt;p&gt;It is worth noting the same thing needs to be done for member objects or collections and hence its usefull to provide some simple converter classes for each type .  The result of this is that services ( that write to a DB) using an ORM tend to have an external message structure  different from the internal OO representation even when the OO model and service is quite small.  Even though this is a burden it does not introduce a lot of time or any complexity and is a good practice to follow for all but the smallest services anyway. ( Again see OO with services article) &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;img src="http://www.shanghai-software.com/blog/aggbug/10.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ben Kloosterman</dc:creator>
            <guid>http://www.shanghai-software.com/blog/archive/2009/01/14/linq-for-sql-and-reattaching-objects-in-ntier-scenarios.aspx</guid>
            <pubDate>Wed, 14 Jan 2009 15:00:23 GMT</pubDate>
            <wfw:comment>http://www.shanghai-software.com/blog/comments/10.aspx</wfw:comment>
            <comments>http://www.shanghai-software.com/blog/archive/2009/01/14/linq-for-sql-and-reattaching-objects-in-ntier-scenarios.aspx#feedback</comments>
            <wfw:commentRss>http://www.shanghai-software.com/blog/comments/commentRss/10.aspx</wfw:commentRss>
            <trackback:ping>http://www.shanghai-software.com/blog/services/trackbacks/10.aspx</trackback:ping>
        </item>
        <item>
            <title>Is LINQ for sql dead</title>
            <link>http://www.shanghai-software.com/blog/archive/2009/01/14/is-linq-for-sql-dead.aspx</link>
            <description>&lt;p&gt; &lt;/p&gt;
&lt;p&gt;There were a lot of comments about the supposed demise of LINQ for SQL people expected it to evolve into a nHibernate style framework (and rightly object to EF  Entity Frameworks change tracking &lt;font face="Arial"&gt;&lt;a href="http://weblogs.asp.net/fbouma/archive/2008/11/21/baby-sitter-framework-2-0-change-tracking-in-the-ef-v2-it-s-still-your-problem.aspx"&gt;http://weblogs.asp.net/fbouma/archive/2008/11/21/baby-sitter-framework-2-0-change-tracking-in-the-ef-v2-it-s-still-your-problem.aspx&lt;/a&gt; ) . &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;I think people miss the point here , LINQ for SQL is and always will be a light weight solution for smaller or RAD style projects. As Damian Guard ( from the LINQ for SQL team ) explains it will be maintained and changes required by the  community will be implemented. &lt;font face="Arial"&gt;&lt;a href="http://damieng.com/blog/2008/10/31/linq-to-sql-next-steps"&gt;http://damieng.com/blog/2008/10/31/linq-to-sql-next-steps&lt;/a&gt;. As it is now it is fine for most current and future needs. &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;I admit this leaves some people in the hole ( especially large scale OO apps) however EF and nHibernate will duke this out.   I have used nHibernate before and personally i dont think the complexity is worth the benefits ,  I spent a lot of times solving nHibernate problems rather than business or even architectural or software design prolems and i also had an issue with the way it handles sessions if you have lots of small stateless calls ( eg web services) it tends to be quite heavy. For EF (Entity Framework)  the jury is out and i will see how it evolves. &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;img src="http://www.shanghai-software.com/blog/aggbug/9.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ben Kloosterman</dc:creator>
            <guid>http://www.shanghai-software.com/blog/archive/2009/01/14/is-linq-for-sql-dead.aspx</guid>
            <pubDate>Wed, 14 Jan 2009 14:17:24 GMT</pubDate>
            <wfw:comment>http://www.shanghai-software.com/blog/comments/9.aspx</wfw:comment>
            <comments>http://www.shanghai-software.com/blog/archive/2009/01/14/is-linq-for-sql-dead.aspx#feedback</comments>
            <wfw:commentRss>http://www.shanghai-software.com/blog/comments/commentRss/9.aspx</wfw:commentRss>
            <trackback:ping>http://www.shanghai-software.com/blog/services/trackbacks/9.aspx</trackback:ping>
        </item>
        <item>
            <title>Are Datasets dead</title>
            <link>http://www.shanghai-software.com/blog/archive/2009/01/14/are-datasets-dead.aspx</link>
            <description>&lt;p&gt;Can anyone see a use for Datasets these days  ? LINQ for SQL seems to have all the bases covered with a much easier and extensible model.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Performance varies dramatically for simpler queries and updates LINQ2SQL seems to have it , but for more complex queries datasets have an edge .  Complex reports are better in datasets but the time for reports to complete is not that relevant as they don't execute so often. &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Here are some benchmarks &lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;&lt;a href="http://www.codeproject.com/KB/database/linqVsADO.aspx"&gt;http://www.codeproject.com/KB/database/linqVsADO.aspx&lt;/a&gt; provides a simple query result and shows simple retrieval.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;&lt;a href="http://visualstudiomagazine.com/features/article.aspx?editorialsid=2372"&gt;&lt;font face="Arial"&gt;http://visualstudiomagazine.com/features/article.aspx?editorialsid=2372&lt;/font&gt;&lt;/a&gt; provides a more complex query which shows lazy loading an area where ORM all have issues but with a large cache these seem to be less in practice. &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;SELECT DISTINCT P.*&lt;br /&gt;
FROM [Products] AS P&lt;br /&gt;
   INNER JOIN [Order Details] AS D &lt;br /&gt;
      ON P.ProductID = D.ProductID&lt;br /&gt;
   INNER JOIN Orders AS O &lt;br /&gt;
      ON O.OrderID = D.OrderID &lt;br /&gt;
   INNER JOIN Customers AS C &lt;br /&gt;
      ON O.CustomerID = C.CustomerID&lt;br /&gt;
WHERE C.Country = @Country&lt;br /&gt;
ORDER BY P.ProductID&lt;/p&gt;
&lt;p&gt;Its worth noting with services and caching LINQ2SQL can gain a significant edge as queries will be simpler. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Flexibility and Maintainability&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The programming model is significantly easier for LINQ2SQL. Both have their issues with  nTier systems though IMHO datasets have a significant issue with identity inserts and having to reconcile them ( much worse than LINQ where you have to re fetch/attach and re-apply the changes) .  &lt;/p&gt;
&lt;p&gt;Though both are set based  systems the big gain LINQ has is the objects can have methods and additional fields via partial classes greatly  improving code quality ,maintainability and flexibility. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ease of use &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ease of use is similar for simple applications but as application get more complex LINQ2SQL gets a big edge while its clumsy to add a SUM field to a datatable adding something unusual like GMT date requires clumsy code which loops through and inserts the custom rows.&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Here is an example &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;AdventureWorksDataContext AdventureDB = new AdventureWorksDataContext(&lt;br /&gt;
            "Data Source=ISSY;Initial Catalog=AdventureWorks;Integrated Security=True");&lt;br /&gt;
//Products is the table we draged and dropped in the dbml designer&lt;br /&gt;
var _data = from _products in AdventureDB.Products &lt;br /&gt;
            select _products;&lt;br /&gt;
dataGridViewLinq.DataSource = _data;&lt;br /&gt;
//Thats it!&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;SqlDataAdapter adapter = &lt;span class="code-keyword"&gt;new&lt;/span&gt; SqlDataAdapter(&lt;span class="code-string"&gt;"&lt;/span&gt;&lt;span class="code-string"&gt;select * from Production.Products"&lt;/span&gt;,&lt;br /&gt;
            &lt;span class="code-string"&gt;"&lt;/span&gt;&lt;span class="code-string"&gt;Data Source=ISSY;Initial Catalog=AdventureWorks;Integrated Security=True"&lt;/span&gt;);&lt;br /&gt;
DataSet ds = &lt;span class="code-keyword"&gt;new&lt;/span&gt; DataSet();&lt;br /&gt;
&lt;span class="code-keyword"&gt;int&lt;/span&gt; x = adapter.Fill(ds);&lt;br /&gt;
dataGridViewADO.DataSource = ds.Tables[&lt;span class="code-digit"&gt;0&lt;/span&gt;];&lt;/p&gt;
&lt;p&gt;Adding a query or altering it requires a new adapter  for a Dataset for LINQ2SQL  you just change the line &lt;/p&gt;
&lt;p&gt;var _data = from _products in AdventureDB.Products &lt;br /&gt;
            select _products;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Integration with other systems &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;IMHO ease of use with other packages is probably the most important thing and both systems are comparable but LINQ2SQL works better with the newer technologies. &lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;table style="WIDTH: 352px; HEIGHT: 193px" cellspacing="1" cellpadding="1" width="352" align="center" summary="" border="0"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt; &lt;/td&gt;
            &lt;td&gt;Datasets&lt;/td&gt;
            &lt;td&gt;LINQ2SQL&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;a title="WCF" href="http://74.55.152.210/blog/WCF" rel=""&gt;Windows Communication Foundation&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;Poor&lt;/td&gt;
            &lt;td&gt;Good&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;WPF&lt;/td&gt;
            &lt;td&gt;Excellent&lt;/td&gt;
            &lt;td&gt;Excellent&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;WF&lt;/td&gt;
            &lt;td&gt;Average&lt;/td&gt;
            &lt;td&gt;Good&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ASP.NET&lt;/td&gt;
            &lt;td&gt;Excellent&lt;/td&gt;
            &lt;td&gt;Excellent&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Forms&lt;/td&gt;
            &lt;td&gt;Excellent&lt;/td&gt;
            &lt;td&gt;Excellent&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;MS Report Engine&lt;/td&gt;
            &lt;td&gt;Excellent &lt;/td&gt;
            &lt;td&gt;Good&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Crystal Reports&lt;/td&gt;
            &lt;td&gt;Excellent&lt;/td&gt;
            &lt;td&gt;Good&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Longevity&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Datasets and LINQ for SQL have similar development commitment from Microsoft ( the only one going forward seems the more bloated Entity Framework) however LINQ2SQL being based on POCO's will be compatible with most systems going forwards. &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Overall&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;table style="WIDTH: 352px; HEIGHT: 193px" cellspacing="1" cellpadding="1" width="352" align="center" summary="" border="0"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt; &lt;/td&gt;
            &lt;td&gt;Datasets&lt;/td&gt;
            &lt;td&gt;LINQ2SQL&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Performance&lt;/td&gt;
            &lt;td&gt;Good&lt;/td&gt;
            &lt;td&gt;Good&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Flexibility/Maintenance&lt;/td&gt;
            &lt;td&gt;Poor&lt;/td&gt;
            &lt;td&gt;Good&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Ease of Use&lt;/td&gt;
            &lt;td&gt;Good&lt;/td&gt;
            &lt;td&gt;Excellent&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Integration&lt;/td&gt;
            &lt;td&gt;Good&lt;/td&gt;
            &lt;td&gt;Good+&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Longevity&lt;/td&gt;
            &lt;td&gt;Average&lt;/td&gt;
            &lt;td&gt;Good&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;I can see no real reason to continue using Datasets especially due to the difficult maintanence , ( its IMHO one of the main reasons RAD apps are hard to maintain) . The long term maintenance also makes the move worthwhile  and all teams by now should have a sufficient skillset    in working with POCO objects.  If teams are working with &lt;a title="WCF" href="http://74.55.152.210/blog/WCF" rel=""&gt;Windows Communication Foundation&lt;/a&gt; they should move immediately. &lt;/p&gt;
&lt;p&gt;Note im mainly referring to RAD style applications or services large OO type applications should consider EF(Entity Framework) , nHibernate or other auto generalting tools like LLBLGEN&lt;/p&gt;&lt;img src="http://www.shanghai-software.com/blog/aggbug/8.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ben Kloosterman</dc:creator>
            <guid>http://www.shanghai-software.com/blog/archive/2009/01/14/are-datasets-dead.aspx</guid>
            <pubDate>Wed, 14 Jan 2009 14:01:45 GMT</pubDate>
            <wfw:comment>http://www.shanghai-software.com/blog/comments/8.aspx</wfw:comment>
            <comments>http://www.shanghai-software.com/blog/archive/2009/01/14/are-datasets-dead.aspx#feedback</comments>
            <wfw:commentRss>http://www.shanghai-software.com/blog/comments/commentRss/8.aspx</wfw:commentRss>
            <trackback:ping>http://www.shanghai-software.com/blog/services/trackbacks/8.aspx</trackback:ping>
        </item>
        <item>
            <title>Simple  services and Linq for SQL - match made in heaven</title>
            <link>http://www.shanghai-software.com/blog/archive/2009/01/14/simple-services-and-linq-for-sql-match-made.aspx</link>
            <description>&lt;p&gt;Im a pretty big fan of Linq for SQL and it works so well with services especially smaller ones ( especially when there are no updates) .&lt;/p&gt;
&lt;p&gt;The fact services are normally responsible for about 3 tables /conceptual domain classes mean you can quickly drag the 3 tables onto the designer and generate the code.   If the structure changes you just recreate the data. &lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Lightweight data &lt;/li&gt;
    &lt;li&gt;Light weight service&lt;/li&gt;
    &lt;li&gt;Light weight testing &lt;/li&gt;
    &lt;li&gt;Light weight procedural code. .&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These services are quick to write and easy to maintain,&lt;/p&gt;&lt;img src="http://www.shanghai-software.com/blog/aggbug/7.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ben Kloosterman</dc:creator>
            <guid>http://www.shanghai-software.com/blog/archive/2009/01/14/simple-services-and-linq-for-sql-match-made.aspx</guid>
            <pubDate>Wed, 14 Jan 2009 12:22:29 GMT</pubDate>
            <wfw:comment>http://www.shanghai-software.com/blog/comments/7.aspx</wfw:comment>
            <comments>http://www.shanghai-software.com/blog/archive/2009/01/14/simple-services-and-linq-for-sql-match-made.aspx#feedback</comments>
            <wfw:commentRss>http://www.shanghai-software.com/blog/comments/commentRss/7.aspx</wfw:commentRss>
            <trackback:ping>http://www.shanghai-software.com/blog/services/trackbacks/7.aspx</trackback:ping>
        </item>
    </channel>
</rss>