<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>C# Development</title>
        <link>http://www.shanghai-software.com/blog/category/7.aspx</link>
        <description>C# Development</description>
        <language>en-AU</language>
        <copyright>Ben Kloosterman</copyright>
        <generator>Subtext Version 2.1.0.5</generator>
        <item>
            <title>C#  High performance programming</title>
            <link>http://www.shanghai-software.com/blog/archive/2010/02/14/c-high-performance-programming.aspx</link>
            <description>&lt;p&gt;I have noticed a number of comparisons with C++ and C# for high performance systems , and the same mistakes are frequently made. I will go over a C# queue which is frequently used in high performance systems.&lt;/p&gt;
&lt;p&gt;1. Any linked list system in C# will preform badly unless - &lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;You manage your memory yourself via unsafe pointers OR&lt;/li&gt;
    &lt;li&gt;You recycle nodes ( which will still not offer great or C++ performance) &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The reason for this should be obvious since any new to create a new record is FAR more expensive than enqueing and most locks.  Hence very high performance C# datastructures really need to be based on arrays or be unsafe . &lt;/p&gt;
&lt;p&gt;2. Structs and Queues are very dangerous &lt;/p&gt;
&lt;p&gt;structs can offer excellent performance especially when passed around via ref. however there are a number of issues.. &lt;/p&gt;
&lt;p&gt;You can pass in structs via ref and retrieve them via out. Note however if you use ,out a queue will reasign the space immediately and hence your data will get over written so this is prob a bad idea.&lt;/p&gt;
&lt;p&gt;Also note when using ref with a struct it can have unintended consequences eg &lt;/p&gt;
&lt;p&gt;AMethod( ref myStruct)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;array[0] = mystruct; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;is almost the same as the method without the ref , the ref will cause an additiona CIL loadobject and hence perform worse.&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/54.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ben Kloosterman</dc:creator>
            <guid>http://www.shanghai-software.com/blog/archive/2010/02/14/c-high-performance-programming.aspx</guid>
            <pubDate>Sun, 14 Feb 2010 02:10:25 GMT</pubDate>
            <wfw:comment>http://www.shanghai-software.com/blog/comments/54.aspx</wfw:comment>
            <comments>http://www.shanghai-software.com/blog/archive/2010/02/14/c-high-performance-programming.aspx#feedback</comments>
            <wfw:commentRss>http://www.shanghai-software.com/blog/comments/commentRss/54.aspx</wfw:commentRss>
            <trackback:ping>http://www.shanghai-software.com/blog/services/trackbacks/54.aspx</trackback:ping>
        </item>
        <item>
            <title>C# and F# are complementary</title>
            <link>http://www.shanghai-software.com/blog/archive/2009/10/11/c-and-f.aspx</link>
            <description> I just had a lot of repetative web work to do and im starting to look at F# , it looks like F# fits really well with C# replacing the batch files / scripts you use and great for proto typing. &lt;br /&gt;
&lt;br /&gt;
Things where C# are better&lt;br /&gt;
Lib /UI Development&lt;br /&gt;
Writing large assemblies&lt;br /&gt;
When you need low level control or unsafe. &lt;br /&gt;
When you use TDD&lt;br /&gt;
&lt;br /&gt;
When F# is better. &lt;br /&gt;
When you need quick and dirty codes ( utilities) &lt;br /&gt;
Screen / Web scraping &lt;br /&gt;
AI scripts &lt;br /&gt;
Mathematics / financial scripts &lt;br /&gt;
Workflow scripts&lt;br /&gt;
Frequently changing code. &lt;br /&gt;
Project control. &lt;br /&gt;
&lt;br /&gt;
How often with C# did you have to do something really simple like put in a bunch of reg setting  (from a reg file) , control nmake/make  for daily builds , prototype code to get quick data to test something etc. F#   seems to do all these things better.  TDD  test scripts should work very well with F# as well.&lt;img src="http://www.shanghai-software.com/blog/aggbug/49.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ben Kloosterman</dc:creator>
            <guid>http://www.shanghai-software.com/blog/archive/2009/10/11/c-and-f.aspx</guid>
            <pubDate>Sun, 11 Oct 2009 08:34:21 GMT</pubDate>
            <wfw:comment>http://www.shanghai-software.com/blog/comments/49.aspx</wfw:comment>
            <comments>http://www.shanghai-software.com/blog/archive/2009/10/11/c-and-f.aspx#feedback</comments>
            <wfw:commentRss>http://www.shanghai-software.com/blog/comments/commentRss/49.aspx</wfw:commentRss>
            <trackback:ping>http://www.shanghai-software.com/blog/services/trackbacks/49.aspx</trackback:ping>
        </item>
        <item>
            <title>C# for low latency applications</title>
            <link>http://www.shanghai-software.com/blog/archive/2009/10/08/c-for-real-time-low-latency-applications.aspx</link>
            <description>There is no argument modern languages  such as Java and C# allow quicker , safer and easier to maintain applications yest there is still a very large amount of C/C++ applications being written. &lt;br /&gt;
&lt;br /&gt;
A lot of use of C++ is simply for 3 reasons&lt;br /&gt;
  - A view of better performance&lt;br /&gt;
  -  Maintaining an existing application   &lt;br /&gt;
  - GC pauses &lt;br /&gt;
  - Environment requires it. &lt;br /&gt;
&lt;br /&gt;
Lets look at these issues &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In practice with realistic budgets a Java/ C# applications will tend to have better performance due to better and easier to use collections and optomizations.  The main performance difference relates to GC costs though the new Concurrent GC should remove most of these for multi core. The idea its not native is a fallacy cince you can use the Mono AOT compiler to generate x86 compiled code.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
GC Pauses are quite valid and is a major obstacle for low latency applications.  There are a number of things you can do &lt;br /&gt;
- There is nothing stopping you using C# and managing your own memory for key performance critical areas. While unsafe is discouraged  C# with some unsafe code is better than C++. &lt;br /&gt;
- The  new Concurrent GC should reduces pauses by 80%&lt;br /&gt;
- Use load balancing SOA/EDA services , this solves  the issue for most cases such as Market data . Its worth noting there is a new event which can take the service out of a cluster while it does a collection. &lt;br /&gt;
&lt;br /&gt;
Also Maintaining an existing application ( or staff skill set) is quite valid  though the point comes when you are maintaing a Large C#/Java code base and have a few C++ bit left. &lt;br /&gt;
&lt;br /&gt;
Lastly some environments do require it such as Windows device drivers , though i do question why more embedded systems dont use managed languages like Tiny OS ( which uses Java) . After all even operating systems are being built in C# ( Singularity , Midori , Cosmos , MOSA)&lt;img src="http://www.shanghai-software.com/blog/aggbug/48.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ben Kloosterman</dc:creator>
            <guid>http://www.shanghai-software.com/blog/archive/2009/10/08/c-for-real-time-low-latency-applications.aspx</guid>
            <pubDate>Thu, 08 Oct 2009 04:31:38 GMT</pubDate>
            <wfw:comment>http://www.shanghai-software.com/blog/comments/48.aspx</wfw:comment>
            <comments>http://www.shanghai-software.com/blog/archive/2009/10/08/c-for-real-time-low-latency-applications.aspx#feedback</comments>
            <wfw:commentRss>http://www.shanghai-software.com/blog/comments/commentRss/48.aspx</wfw:commentRss>
            <trackback:ping>http://www.shanghai-software.com/blog/services/trackbacks/48.aspx</trackback:ping>
        </item>
        <item>
            <title>Silverlight 3- impressive stuff</title>
            <link>http://www.shanghai-software.com/blog/archive/2009/04/06/41.aspx</link>
            <description>Just saw this MIX Video &lt;br /&gt;
&lt;br /&gt;
http://videos.visitmix.com/MIX09/T40F&lt;br /&gt;
&lt;br /&gt;
Pretty impressive ( and they handle search engines) , if its as easy as it looks it will be great . Will check it out over the next few days.  Silverlight has 3 major versions in 18 months mmm , could it be the focus for MS ( with Azure)  , kind of tempted to go this way rather than WPF to support other platforms a multiplatform MS ??&lt;img src="http://www.shanghai-software.com/blog/aggbug/41.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ben Kloosterman</dc:creator>
            <guid>http://www.shanghai-software.com/blog/archive/2009/04/06/41.aspx</guid>
            <pubDate>Mon, 06 Apr 2009 09:33:16 GMT</pubDate>
            <wfw:comment>http://www.shanghai-software.com/blog/comments/41.aspx</wfw:comment>
            <comments>http://www.shanghai-software.com/blog/archive/2009/04/06/41.aspx#feedback</comments>
            <wfw:commentRss>http://www.shanghai-software.com/blog/comments/commentRss/41.aspx</wfw:commentRss>
            <trackback:ping>http://www.shanghai-software.com/blog/services/trackbacks/41.aspx</trackback:ping>
        </item>
        <item>
            <title>Are projects getting more successful</title>
            <link>http://www.shanghai-software.com/blog/archive/2009/01/16/are-projects-getting-more-successfull.aspx</link>
            <description>&lt;p&gt;Im curious at the increase rate of sucess in a number of surveys such as the later CHAOS surveys. Looking in the detail however it appears that projects after peaking in 2000 the amount of time overrun and the amount of features completed have dropped dramatically in the vast majority of projects. Not sure what it means but to me it DOESNT mean software development is getting better if features are getting dropped  and there are increasing time blow outs. &lt;/p&gt;
&lt;p&gt;Things that come to mind&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Standards for success and projects have increasing amounts of over estimation to prevent failure and hence they come on time and on budget. (See should projects have risk contingencies) &lt;/li&gt;
    &lt;li&gt;Core elements which are critical to the business with good ROI are being prioritized and delivered while less critical features are not. &lt;/li&gt;
    &lt;li&gt;Less framework creation /coding is resulting in higher success. ( Projects with poor framework progress are/were often cancelled early as they had few deliverables) &lt;/li&gt;
    &lt;li&gt;How can the time blow out and the project still be considered a success &lt;/li&gt;
    &lt;li&gt;Projects are smaller. A lot less managers have the stomach for the $100M+ projects  in the 90s &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt; It also very interesting surveys with a loose success definition have a much higher rate &lt;/p&gt;
&lt;p&gt;eg &lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;&lt;a href="http://www.ambysoft.com/surveys/success2007.html"&gt;http://www.ambysoft.com/surveys/success2007.html&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;shows success rates as 63-72% vs 34% for Chaos . I think you MUST have a concrete definition to get anything from a survey in terms of project management and Development methodologies otherwise it is too subjective based on the team . &lt;/p&gt;
&lt;p&gt;Chaos defines success as “on time, on budget, meeting the spec”, &lt;/p&gt;
&lt;p&gt;With looser definitions of success you get  some interesting things &lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;"40.9% of respondents considered cancelling a troubled project to be a success. " &lt;/li&gt;
    &lt;li&gt;The offshore rate of 43% shows how subjective a non standard definition can be ( People will rate external teams harsher than teams they are part off) . I have yet to meet a company that allows offshore firms Agile methods. People often ask these firms fixed price - which no doubt affects quality and perception but the ultimate goal of ROI is likely to be better ( IMHO).&lt;br /&gt;
    &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt; Yet project success and budgets in Agile environments are hard to relate back to the requirements and original plan. &lt;/p&gt;
&lt;p&gt;My feeling is projects are getting a bit more succesfull however i also think the cost of new software has gone up massively.  This is good in that business are willing to pay it but bad in terms of ultimate benefit and ROI .  Part of this is due to higher demands from business while in the past internal applications had a simple grey form now people  demand colours , fonts a web interface for access at home , animated indicators etc  &lt;/p&gt;
&lt;p&gt;Its worth stating the massive improvements in the tools ( where did the time go) . I'm definetly become a believer in Parkinsons law which has pretty big implications for software development  &lt;/p&gt;
&lt;p&gt;&lt;em&gt;Work expands so as to fill the time available for its completion.&lt;/em&gt; &lt;/p&gt;
&lt;p&gt;In its generalized form. &lt;/p&gt;
&lt;p&gt;&lt;em&gt;The demand upon a resource tends to expand to match the supply of the resource.&lt;/em&gt; &lt;/p&gt;
&lt;p&gt;In software its more likely that the work expands to fill the time available +0-50% depending on how strong the management is . &lt;/p&gt;
&lt;p&gt;Looking further i found this &lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;&lt;a href="http://www.focusedperformance.com/articles/ccpm.html"&gt;http://www.focusedperformance.com/articles/ccpm.html&lt;/a&gt; pretty spot on in describing the problem. &lt;br /&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;p style="font-style: italic;"&gt;&lt;font face="Verdana,Arial,Geneva,SunSans-Regular"&gt;&lt;font size="2" face="Verdana,Arial,Geneva,SunSans-Regular"&gt;An aggressive target duration schedule, along with elimination of task due-dates, minimizes impact of&lt;br /&gt;
"Parkinson's Law."&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; Anyway the thoughts are a bit loose in this post . &lt;br /&gt;
&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;img src="http://www.shanghai-software.com/blog/aggbug/18.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ben Kloosterman</dc:creator>
            <guid>http://www.shanghai-software.com/blog/archive/2009/01/16/are-projects-getting-more-successfull.aspx</guid>
            <pubDate>Thu, 15 Jan 2009 16:11:40 GMT</pubDate>
            <wfw:comment>http://www.shanghai-software.com/blog/comments/18.aspx</wfw:comment>
            <comments>http://www.shanghai-software.com/blog/archive/2009/01/16/are-projects-getting-more-successfull.aspx#feedback</comments>
            <wfw:commentRss>http://www.shanghai-software.com/blog/comments/commentRss/18.aspx</wfw:commentRss>
            <trackback:ping>http://www.shanghai-software.com/blog/services/trackbacks/18.aspx</trackback:ping>
        </item>
        <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 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>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>Post by Frans Bouma</title>
            <link>http://www.shanghai-software.com/blog/archive/2009/01/13/post-by-frans-bouma.aspx</link>
            <description>&lt;p&gt;Loved this post  so had  to emphasize and post it. &lt;/p&gt;
&lt;p&gt;"That's not the case. A framework user doesn't give a **** about how many different patterns the framework is using and how great and awesome it's internally and how it will ultimately evolve in the bringer of world peace. A framework user is interested in whether the framework takes care of things the framework user &lt;em&gt;can't afford&lt;/em&gt; to spend time on. After all, the framework user can't afford to spend time paid by the customer on plumbing, on writing infrastructure code. &lt;strong&gt;The framework user is paid to write code directly related to the problem at hand: the application for the customer. No customer should accept that the team hired for writing the line-of-business application has spend time on writing a report-control or for example a grid control. So why should a customer accept to pay for time spend on other plumbing code?&lt;/strong&gt; Just because the customer doesn't know any better? If so, isn't that erm... taking advantage of the inability of the customer to judge what the 'software guys' did was correct? &lt;/p&gt;
&lt;p&gt;Yes, it's that extreme. &lt;strong&gt;The software industry should grow up and realize that it shouldn't be acceptable anymore to write frameworks and framework code, plumbing code etc. paid by the customer, just because the customer doesn't know any better&lt;/strong&gt;. And we, the software developers, should grow up and accept that the job many of us have isn't to write plumbing code and infrastructure code, but to write code &lt;em&gt;using&lt;/em&gt; the plumbing available. If the plumbing at the place where you work is broken, it's very likely that someone will call a plumber to fix it. So why accept that if the plumbing used for a project is broken, one has to fix it themselves? With all the bugs, loss of time, focus and ultimately: money, as a result? "&lt;/p&gt;
&lt;p&gt;I dont think its extreme at all , the same attittude in the industry is pervasive ( See where has the productivity gone) . The industry routinely delivers software that is over engineered for the job and the additional code and complexity instead of reducing maintenance actually makes support and maintenance more costly.  This also applies to implementing SOA  and EDA architectures for organizations which are too small to see the benefit. &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;img src="http://www.shanghai-software.com/blog/aggbug/6.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ben Kloosterman</dc:creator>
            <guid>http://www.shanghai-software.com/blog/archive/2009/01/13/post-by-frans-bouma.aspx</guid>
            <pubDate>Tue, 13 Jan 2009 13:04:08 GMT</pubDate>
            <wfw:comment>http://www.shanghai-software.com/blog/comments/6.aspx</wfw:comment>
            <comments>http://www.shanghai-software.com/blog/archive/2009/01/13/post-by-frans-bouma.aspx#feedback</comments>
            <wfw:commentRss>http://www.shanghai-software.com/blog/comments/commentRss/6.aspx</wfw:commentRss>
            <trackback:ping>http://www.shanghai-software.com/blog/services/trackbacks/6.aspx</trackback:ping>
        </item>
    </channel>
</rss>