<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Matthieu MEZIL : Entity Framework (EF)</title><link>http://msmvps.com/blogs/matthieu/archive/tags/Entity+Framework+_2800_EF_2900_/default.aspx</link><description>Tags: Entity Framework (EF)</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Data oriented WCF service Agile with EF4 and a “sort of” provider LINQ</title><link>http://msmvps.com/blogs/matthieu/archive/2009/11/24/data-oriented-wcf-service-agile-with-ef4-and-a-sort-of-provider-linq.aspx</link><pubDate>Wed, 25 Nov 2009 00:17:38 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1742036</guid><dc:creator>Matthieu MEZIL</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/rsscomments.aspx?PostID=1742036</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/commentapi.aspx?PostID=1742036</wfw:comment><comments>http://msmvps.com/blogs/matthieu/archive/2009/11/24/data-oriented-wcf-service-agile-with-ef4-and-a-sort-of-provider-linq.aspx#comments</comments><description>&lt;p&gt;I use a different approach than &lt;a href="http://thedatafarm.com/blog/data-access" target="_blank"&gt;Julie’s one&lt;/a&gt; for EF Agile development. Indeed, I use here Self-Tracking Entities and I massively use T4.&lt;/p&gt;  &lt;p&gt;The first step is to create a project DAL in which we will add an edmx. &lt;/p&gt;  &lt;p&gt;In my sample, I use Northwind DataBase with only the Customers, Orders and [Order Details] tables.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.metablogapi/0458.image_5F00_0215522E.png"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.metablogapi/6403.image_5F00_thumb_5F00_23A15532.png" width="608" height="420" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;When it’s done, we will add a new item of type ADO.NET Self-Tracking Entity Generator to our project.&lt;/p&gt;  &lt;p&gt;It will add two T4 templates to our project: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;one with entities + some classes and interfaces for Self-Tracking &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.metablogapi/2514.image_5F00_261A6123.png"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.metablogapi/6724.image_5F00_thumb_5F00_1EEAFEDE.png" width="1422" height="1216" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;one with the context + a static class with extension methods. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;We will move our entities template into another project Entities.&lt;/p&gt;  &lt;p&gt;Then we have to add the Entities reference in our DAL project. We will also set the edmx path in our templates. &lt;/p&gt;  &lt;p&gt;Then, we will create a new project Repositories. In this project, we will define an interface INorthwindRepository.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.metablogapi/8461.image_5F00_1449DF24.png"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.metablogapi/2514.image_5F00_thumb_5F00_49FF247E.png" width="1145" height="612" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;We can see the redundancy of INorthwindRepository. That’s why, in my sample, these interfaces (INorthwindRepository and IEntitySet) are also generated with a T4 template which uses my edmx. What is great here is the fact that if we change our data model (my edmx), we have no more code to write. We just have to regenerate all my T4 templates.&lt;/p&gt;  &lt;p&gt;Now, we will go back to my context. It has to implement INorthwindRepository. For this, we will update my T4 template to have this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.metablogapi/8877.image_5F00_2967BEFF.png"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.metablogapi/2117.image_5F00_thumb_5F00_59CE1DA8.png" width="1422" height="867" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;For WCF, we need a contract. So I will add two new projects: Services and ServiceContracts (with T4).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.metablogapi/6724.image_5F00_6BF698D0.png"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.metablogapi/6215.image_5F00_thumb_5F00_7C2260C9.png" width="771" height="544" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.metablogapi/0451.image_5F00_755F3179.png"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.metablogapi/1512.image_5F00_thumb_5F00_712533E7.png" width="822" height="625" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;So now, if you already have the T4 templates (which are independent of the project), you wrote 0 lines of code!&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;We can see the assemblies independence with EF (except for the DAL of course) :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.metablogapi/8877.image_5F00_71ED7404.png"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.metablogapi/4657.image_5F00_thumb_5F00_36B99839.png" width="308" height="1046" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I wanted to use &lt;a href="http://www.codeplex.com/unity/" target="_blank"&gt;Unity&lt;/a&gt;. To do it, I use &lt;a href="http://www.silverlightshow.net/items/Deep-dive-into-WCF-part-1-TDD.aspx" target="_blank"&gt;Alexey Zakharov approach&lt;/a&gt;. So I integrate his WCFFacility project and classes Bootstrapper and UnityServiceLocatorAdapter in my WCFService (web project host). After creating the svc and the config file, my service is finished!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Now in the client tier, I wanted to use a “sort of” provider LINQ. For this, I inspired from &lt;a href="http://msmvps.com/blogs/matthieu/archive/2009/04/28/french-alt-net-demo.aspx" target="_blank"&gt;one of my old demo&lt;/a&gt; made for &lt;a href="http://www.altnetfr.org/" target="_blank"&gt;ALT.NET French community&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;We will create a Client.LINQ project in which we will define two classes: ClientLINQ and MyQueryable.&lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:consolas;color:blue;"&gt;public&lt;/span&gt;&lt;span style="font-family:consolas;"&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ClientLINQ        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;{      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyQueryable&lt;/span&gt;&amp;lt;T&amp;gt; Where&amp;lt;T&amp;gt;(&lt;span style="color:blue;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyQueryable&lt;/span&gt;&amp;lt;T&amp;gt; source, &lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;gt;&amp;gt; where)       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;source.WhereValue = &lt;span style="color:blue;"&gt;string&lt;/span&gt;.Concat(source.WhereValue ?? &lt;span style="color:#a31515;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;, where.Body.ToString().Replace(&lt;span style="color:blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;&amp;quot;{0}.&amp;quot;&lt;/span&gt;, where.Parameters[&lt;span style="color:brown;"&gt;0&lt;/span&gt;].Name), &lt;span style="color:#a31515;"&gt;&amp;quot;it.&amp;quot;&lt;/span&gt;).Replace(&lt;span style="color:#a31515;"&gt;&amp;quot;\&amp;quot;&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;).Replace(&lt;span style="color:#a31515;"&gt;&amp;quot;||&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot; OR &amp;quot;&lt;/span&gt;).Replace(&lt;span style="color:#a31515;"&gt;&amp;quot;&amp;amp;&amp;amp;&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot; AND &amp;quot;&lt;/span&gt;));       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;color:blue;mso-ansi-language:fr;" lang="FR"&gt;return&lt;/span&gt;&lt;span style="font-family:consolas;mso-ansi-language:fr;" lang="FR"&gt; source;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;mso-ansi-language:fr;" lang="FR"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;mso-ansi-language:fr;" lang="FR"&gt;&lt;/span&gt;    &lt;p&gt;&amp;#160; &lt;br /&gt;&lt;/p&gt; &lt;/p&gt; &lt;span style="font-family:consolas;mso-ansi-language:fr;" lang="FR"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyQueryable&lt;/span&gt;&amp;lt;T&amp;gt; OrderBy&amp;lt;T, T2&amp;gt;(&lt;span style="color:blue;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyQueryable&lt;/span&gt;&amp;lt;T&amp;gt; source, &lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T, T2&amp;gt;&amp;gt; orderBy)     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;mso-ansi-language:fr;" lang="FR"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;{    &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;source.OrderByValue = orderBy.Body.ToString().Replace(&lt;span style="color:blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;&amp;quot;{0}.&amp;quot;&lt;/span&gt;, orderBy.Parameters[&lt;span style="color:brown;"&gt;0&lt;/span&gt;].Name), &lt;span style="color:#a31515;"&gt;&amp;quot;it.&amp;quot;&lt;/span&gt;);     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; source;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;   &lt;p&gt;&amp;#160; &lt;br /&gt;&lt;/p&gt; &lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyQueryable&lt;/span&gt;&amp;lt;T&amp;gt; Include&amp;lt;T&amp;gt;(&lt;span style="color:blue;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyQueryable&lt;/span&gt;&amp;lt;T&amp;gt; source, &lt;span style="color:blue;"&gt;string&lt;/span&gt; include)     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;source.IncludeValues.Add(include);     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; source;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;   &lt;p&gt;&amp;#160; &lt;br /&gt;&lt;/p&gt; &lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyQueryable&lt;/span&gt;&amp;lt;T&amp;gt; Skip&amp;lt;T&amp;gt;(&lt;span style="color:blue;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyQueryable&lt;/span&gt;&amp;lt;T&amp;gt; source, &lt;span style="color:blue;"&gt;int&lt;/span&gt; number)     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;source.SkipValue = number;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; source;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;   &lt;p&gt;&amp;#160; &lt;br /&gt;&lt;/p&gt; &lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyQueryable&lt;/span&gt;&amp;lt;T&amp;gt; Take&amp;lt;T&amp;gt;(&lt;span style="color:blue;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyQueryable&lt;/span&gt;&amp;lt;T&amp;gt; source, &lt;span style="color:blue;"&gt;int&lt;/span&gt; number)     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;source.TakeValue = number;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; source;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;   &lt;p&gt;&amp;#160; &lt;br /&gt;&lt;/p&gt; &lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; T FirstOrDefault&amp;lt;T&amp;gt;(&lt;span style="color:blue;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyQueryable&lt;/span&gt;&amp;lt;T&amp;gt; source)     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;source.TakeValue = &lt;span style="color:brown;"&gt;1&lt;/span&gt;;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; source.AsEnumerable().FirstOrDefault();     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;   &lt;p&gt;&amp;#160; &lt;br /&gt;&lt;/p&gt; &lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; T First&amp;lt;T&amp;gt;(&lt;span style="color:blue;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyQueryable&lt;/span&gt;&amp;lt;T&amp;gt; source)     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;source.TakeValue = &lt;span style="color:brown;"&gt;1&lt;/span&gt;;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; source.AsEnumerable().First();     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;   &lt;p&gt;&amp;#160; &lt;br /&gt;&lt;/p&gt; &lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyQueryable&lt;/span&gt;&amp;lt;T&amp;gt; ToMyQueryable&amp;lt;T&amp;gt;(&lt;span style="color:blue;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source)     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; value = source &lt;span style="color:blue;"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyQueryable&lt;/span&gt;&amp;lt;T&amp;gt;;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (value == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;value = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyQueryable&lt;/span&gt;&amp;lt;T&amp;gt;(source);     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; value;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;}&lt;/span&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:consolas;color:blue;"&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:consolas;color:blue;"&gt;public&lt;/span&gt;&lt;span style="font-family:consolas;"&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyQueryable&lt;/span&gt;&amp;lt;T&amp;gt; : &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;{      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; MyQueryable()       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; MyQueryable(&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; enumerable)       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;Enumerable = enumerable;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;/span&gt;    &lt;p&gt;&amp;#160; &lt;br /&gt;&lt;/p&gt; &lt;/p&gt; &lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; Enumerable { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;   &lt;p&gt;&amp;#160; &lt;br /&gt;&lt;/p&gt; &lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerator&lt;/span&gt;&amp;lt;T&amp;gt; GetEnumerator()     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; Enumerable.GetEnumerator();     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;System.Collections.&lt;span style="color:#2b91af;"&gt;IEnumerator&lt;/span&gt; System.Collections.&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;.GetEnumerator()     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; GetEnumerator();     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;   &lt;p&gt;&amp;#160; &lt;br /&gt;&lt;/p&gt; &lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; _allEntities = &lt;span style="color:blue;"&gt;true&lt;/span&gt;;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; AllEntities     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; _allEntities; }     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;internal&lt;/span&gt; &lt;span style="color:blue;"&gt;set      &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;_allEntities = &lt;span style="color:blue;"&gt;value&lt;/span&gt;;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (&lt;span style="color:blue;"&gt;value&lt;/span&gt;)     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;IncludeValues.Clear();     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;WhereValue = &lt;span style="color:blue;"&gt;null&lt;/span&gt;;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;OrderByValue = &lt;span style="color:blue;"&gt;null&lt;/span&gt;;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;SkipValue = &lt;span style="color:blue;"&gt;null&lt;/span&gt;;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;TakeValue = &lt;span style="color:blue;"&gt;null&lt;/span&gt;;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ObservableCollection&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; _includeValues;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ObservableCollection&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; IncludeValues     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;get      &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (_includeValues == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;_includeValues = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ObservableCollection&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt;();     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;_includeValues.CollectionChanged += (sender, e) =&amp;gt;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (e.Action == &lt;span style="color:#2b91af;"&gt;NotifyCollectionChangedAction&lt;/span&gt;.Add)     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;AllEntities = &lt;span style="color:blue;"&gt;false&lt;/span&gt;;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;};     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; _includeValues;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; _whereValue;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; WhereValue     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; _whereValue; }     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;internal&lt;/span&gt; &lt;span style="color:blue;"&gt;set      &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (&lt;span style="color:blue;"&gt;value&lt;/span&gt; != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;AllEntities = &lt;span style="color:blue;"&gt;false&lt;/span&gt;;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;_whereValue = &lt;span style="color:blue;"&gt;value&lt;/span&gt;;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; _orderByValue;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; OrderByValue     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; _orderByValue; }     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;internal&lt;/span&gt; &lt;span style="color:blue;"&gt;set      &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (&lt;span style="color:blue;"&gt;value&lt;/span&gt; != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;AllEntities = &lt;span style="color:blue;"&gt;false&lt;/span&gt;;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;_orderByValue = &lt;span style="color:blue;"&gt;value&lt;/span&gt;;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt;? _skipValue;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt;? SkipValue&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; _skipValue; }     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;internal&lt;/span&gt; &lt;span style="color:blue;"&gt;set      &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (&lt;span style="color:blue;"&gt;value&lt;/span&gt;.HasValue)     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;AllEntities = &lt;span style="color:blue;"&gt;false&lt;/span&gt;;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;_skipValue = &lt;span style="color:blue;"&gt;value&lt;/span&gt;;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt;? _takeValue;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt;? TakeValue&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; _takeValue; }     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;internal&lt;/span&gt; &lt;span style="color:blue;"&gt;set      &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (&lt;span style="color:blue;"&gt;value&lt;/span&gt;.HasValue)     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;AllEntities = &lt;span style="color:blue;"&gt;false&lt;/span&gt;;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;_takeValue = &lt;span style="color:blue;"&gt;value&lt;/span&gt;;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;}    &lt;p&gt;&lt;/p&gt; &lt;/span&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Then, we will create our client project (a Test project in my sample). In this project, I add Entities project and Client.LINQ references. Client.LINQ is not mandatory. I can also duplicate my entities code but in order to have Self-Tracking, I can’t use the default generated code. Then, we will add the WCF service reference. To use my “sort of” provider LINQ, I need some MyQueryable of my entities. Here also, (I hope that you guess it), we can use a T4 template.&lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:consolas;color:blue;"&gt;public&lt;/span&gt;&lt;span style="font-family:consolas;"&gt; &lt;span style="color:blue;"&gt;partial&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;NorthwindClientContext        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;{&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;INorthwindService&lt;/span&gt; _service;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;     &lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; NorthwindClientContext(&lt;span style="color:#2b91af;"&gt;INorthwindService&lt;/span&gt; service)     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;_service = service;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&amp;#160;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyQueryable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Customer&lt;/span&gt;&amp;gt; Customers     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;get      &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; value = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyQueryable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Customer&lt;/span&gt;&amp;gt;();     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;value.Enumerable = GetCustomers(value);     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; value;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Customer&lt;/span&gt;&amp;gt; GetCustomers(&lt;span style="color:#2b91af;"&gt;MyQueryable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Customer&lt;/span&gt;&amp;gt; myQueryable)     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Customer&lt;/span&gt;&amp;gt; value;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (myQueryable.AllEntities)     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;value = _service.GetAllCustomers();     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;else      &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;value = _service.GetCustomers(myQueryable.IncludeValues.ToList(), myQueryable.WhereValue, myQueryable.OrderByValue, myQueryable.SkipValue, myQueryable.TakeValue);     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; entity &lt;span style="color:blue;"&gt;in&lt;/span&gt; value)     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;yield&lt;/span&gt; &lt;span style="color:blue;"&gt;return&lt;/span&gt; entity;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}&amp;#160; &lt;br /&gt;    &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyQueryable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Order&lt;/span&gt;&amp;gt; Orders     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;get      &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; value = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyQueryable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Order&lt;/span&gt;&amp;gt;();     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;value.Enumerable = GetOrders(value);     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; value;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Order&lt;/span&gt;&amp;gt; GetOrders(&lt;span style="color:#2b91af;"&gt;MyQueryable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Order&lt;/span&gt;&amp;gt; myQueryable)     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Order&lt;/span&gt;&amp;gt; value;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (myQueryable.AllEntities)     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;value = _service.GetAllOrders();     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;else      &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;value = _service.GetOrders(myQueryable.IncludeValues.ToList(), myQueryable.WhereValue, myQueryable.OrderByValue, myQueryable.SkipValue, myQueryable.TakeValue);     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; entity &lt;span style="color:blue;"&gt;in&lt;/span&gt; value)     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;yield&lt;/span&gt; &lt;span style="color:blue;"&gt;return&lt;/span&gt; entity;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}&amp;#160; &lt;br /&gt;    &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyQueryable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;OrderDetail&lt;/span&gt;&amp;gt; OrderDetails     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;get      &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; value = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyQueryable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;OrderDetail&lt;/span&gt;&amp;gt;();     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;value.Enumerable = GetOrderDetails(value);     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; value;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;OrderDetail&lt;/span&gt;&amp;gt; GetOrderDetails(&lt;span style="color:#2b91af;"&gt;MyQueryable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;OrderDetail&lt;/span&gt;&amp;gt; myQueryable)     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;OrderDetail&lt;/span&gt;&amp;gt; value;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (myQueryable.AllEntities)     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;value = _service.GetAllOrderDetails();     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;else      &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;value = _service.GetOrderDetails(myQueryable.IncludeValues.ToList(), myQueryable.WhereValue, myQueryable.OrderByValue, myQueryable.SkipValue, myQueryable.TakeValue);     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; entity &lt;span style="color:blue;"&gt;in&lt;/span&gt; value)     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;yield&lt;/span&gt; &lt;span style="color:blue;"&gt;return&lt;/span&gt; entity;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;}    &lt;p&gt;&lt;/p&gt; &lt;/span&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;The use of the yield return will postpone the execution and allow MyQueryable properties to be set when GetCustomers / GetOrders / GetOrderDetails methods are called.&lt;/p&gt;  &lt;p&gt;So the following code:&lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:consolas;color:blue;mso-bidi-font-size:9.5pt;"&gt;var&lt;/span&gt;&lt;span style="font-family:consolas;mso-bidi-font-size:9.5pt;"&gt; order = (&lt;span style="color:blue;"&gt;from&lt;/span&gt; o &lt;span style="color:blue;"&gt;in&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;NorthwindClientContext&lt;/span&gt;(service).Orders.Include(&lt;span style="color:#a31515;"&gt;&amp;quot;Customer&amp;quot;&lt;/span&gt;).Include(&lt;span style="color:#a31515;"&gt;&amp;quot;OrderDetails&amp;quot;&lt;/span&gt;)       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;mso-bidi-font-size:9.5pt;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;where&lt;/span&gt; o.ShipCity == &lt;span style="color:#a31515;"&gt;&amp;quot;PARIS&amp;quot;        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;mso-bidi-font-size:9.5pt;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;orderby&lt;/span&gt; o.OrderDate       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;mso-bidi-font-size:9.5pt;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;select&lt;/span&gt; o).Skip(&lt;span style="color:brown;"&gt;2&lt;/span&gt;).First(); &lt;/span&gt;    &lt;p&gt;&lt;/p&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;will call this method &lt;/p&gt;  &lt;p&gt;_service.GetOrders(myQueryable.IncludeValues.ToList(), myQueryable.WhereValue, myQueryable.OrderByValue, myQueryable.SkipValue, myQueryable.TakeValue)&lt;/p&gt;  &lt;p&gt;with these parameters:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.metablogapi/0447.image_5F00_7A1173CE.png"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.metablogapi/0844.image_5F00_thumb_5F00_4C43AB09.png" width="414" height="190" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;wich will generate the following SQL query:&lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;SELECT&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[OrderID] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [OrderID]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[CustomerID] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [CustomerID]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[EmployeeID] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [EmployeeID]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[OrderDate] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [OrderDate]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[RequiredDate] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [RequiredDate]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShippedDate] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShippedDate]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipVia] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipVia]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Freight] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Freight]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipName] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipName]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipAddress] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipAddress]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipCity] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipCity]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipRegion] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipRegion]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipPostalCode] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipPostalCode]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipCountry] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipCountry]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[CustomerID1] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [CustomerID1]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[CompanyName] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [CompanyName]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ContactName] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ContactName]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ContactTitle] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ContactTitle]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Address] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Address]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[City] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [City]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Region] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Region]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[PostalCode] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [PostalCode]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Country] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Country]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Phone] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Phone]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Fax] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Fax]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[C1] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [C1]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[OrderID1] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [OrderID1]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ProductID] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ProductID]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[UnitPrice] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [UnitPrice]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Quantity] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Quantity]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Discount] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Discount]       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;FROM &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:10pt;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt; &lt;span style="color:blue;"&gt;SELECT&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Limit1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[OrderID] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [OrderID]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Limit1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[CustomerID1] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [CustomerID]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Limit1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[EmployeeID] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [EmployeeID]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Limit1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[OrderDate] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [OrderDate]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Limit1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[RequiredDate] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [RequiredDate]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Limit1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShippedDate] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShippedDate]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Limit1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipVia] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipVia]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Limit1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Freight] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Freight]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Limit1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipName] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipName]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Limit1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipAddress] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipAddress]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Limit1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipCity] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipCity]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Limit1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipRegion] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipRegion]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Limit1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipPostalCode] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipPostalCode]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Limit1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipCountry] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipCountry]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Limit1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[CustomerID2] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [CustomerID1]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Limit1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[CompanyName] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [CompanyName]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Limit1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ContactName] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ContactName]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Limit1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ContactTitle] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ContactTitle]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Limit1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Address] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Address]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Limit1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[City] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [City]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Limit1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Region] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Region]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Limit1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[PostalCode] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [PostalCode]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Limit1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Country] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Country]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Limit1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Phone] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Phone]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Limit1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Fax] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Fax]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Extent3]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[OrderID] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [OrderID1]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Extent3]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ProductID] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ProductID]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Extent3]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[UnitPrice] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [UnitPrice]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Extent3]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Quantity] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Quantity]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[Extent3]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Discount] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Discount]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;CASE&lt;/span&gt; &lt;span style="color:blue;"&gt;WHEN &lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;[Extent3]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[OrderID] &lt;span style="color:gray;"&gt;IS&lt;/span&gt; &lt;span style="color:gray;"&gt;NULL)&lt;/span&gt; &lt;span style="color:blue;"&gt;THEN&lt;/span&gt; &lt;span style="color:fuchsia;"&gt;CAST&lt;/span&gt;&lt;span style="color:gray;"&gt;(NULL&lt;/span&gt; &lt;span style="color:blue;"&gt;AS&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;span style="color:gray;"&gt;)&lt;/span&gt; &lt;span style="color:blue;"&gt;ELSE&lt;/span&gt; 1 &lt;span style="color:blue;"&gt;END&lt;/span&gt; &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [C1]       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;FROM&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT&lt;/span&gt; &lt;span style="color:blue;"&gt;TOP &lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;1&lt;span style="color:gray;"&gt;)&lt;/span&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[OrderID]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[CustomerID1]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[EmployeeID]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[OrderDate]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[RequiredDate]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShippedDate]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipVia]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Freight]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipName]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipAddress]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipCity]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipRegion]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipPostalCode]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipCountry]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[CustomerID2]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[CompanyName]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ContactName]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ContactTitle]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Address]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[City]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Region]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[PostalCode]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Country]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Phone]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Fax]       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt; &lt;span style="color:blue;"&gt;SELECT&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[OrderID] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [OrderID]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[CustomerID] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [CustomerID1]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[EmployeeID] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [EmployeeID]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[OrderDate] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [OrderDate]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[RequiredDate] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [RequiredDate]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShippedDate] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShippedDate]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipVia] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipVia]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Freight] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Freight]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipName] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipName]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipAddress] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipAddress]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipCity] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipCity]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipRegion] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipRegion]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipPostalCode] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipPostalCode]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipCountry] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipCountry]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent2]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[CustomerID] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [CustomerID2]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent2]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[CompanyName] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [CompanyName]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent2]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ContactName] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ContactName]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent2]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ContactTitle] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ContactTitle]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent2]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Address] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Address]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent2]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[City] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [City]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent2]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Region] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Region]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent2]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[PostalCode] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [PostalCode]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent2]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Country] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Country]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent2]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Phone] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Phone]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent2]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Fax] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Fax]&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:fuchsia;"&gt;row_number&lt;/span&gt;&lt;span style="color:gray;"&gt;()&lt;/span&gt; &lt;span style="color:blue;"&gt;OVER &lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:blue;"&gt;ORDER&lt;/span&gt; &lt;span style="color:blue;"&gt;BY&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[OrderDate] &lt;span style="color:blue;"&gt;ASC&lt;/span&gt;&lt;span style="color:gray;"&gt;)&lt;/span&gt; &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [row_number]       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;FROM&lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;/span&gt;[dbo]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Orders] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Extent1]       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:gray;"&gt;LEFT&lt;/span&gt; &lt;span style="color:gray;"&gt;OUTER&lt;/span&gt; &lt;span style="color:gray;"&gt;JOIN&lt;/span&gt; [dbo]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Customers] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Extent2] &lt;span style="color:blue;"&gt;ON&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[CustomerID] &lt;span style="color:gray;"&gt;=&lt;/span&gt; [Extent2]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[CustomerID]       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;WHERE&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipCity] &lt;span style="color:gray;"&gt;=&lt;/span&gt; &lt;span style="color:red;"&gt;&amp;#39;PARIS&amp;#39;        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:gray;"&gt;)&lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Filter1]       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;WHERE&lt;/span&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[row_number] &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt; 2       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;ORDER&lt;/span&gt; &lt;span style="color:blue;"&gt;BY&lt;/span&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[OrderDate] &lt;span style="color:blue;"&gt;ASC&lt;/span&gt; &lt;span style="color:gray;"&gt;)&lt;/span&gt; &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Limit1]       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:gray;"&gt;LEFT&lt;/span&gt; &lt;span style="color:gray;"&gt;OUTER&lt;/span&gt; &lt;span style="color:gray;"&gt;JOIN&lt;/span&gt; [dbo]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Order Details] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Extent3] &lt;span style="color:blue;"&gt;ON&lt;/span&gt; [Limit1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[OrderID] &lt;span style="color:gray;"&gt;=&lt;/span&gt; [Extent3]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[OrderID]       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:10pt;mso-no-proof:yes;"&gt;)&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Project1] &lt;/span&gt;    &lt;p&gt;&lt;/p&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt; &lt;span style="line-height:115%;font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-ansi-language:en-us;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-fareast-language:en-us;mso-bidi-language:ar-sa;mso-no-proof:yes;"&gt;ORDER&lt;/span&gt;&lt;span style="line-height:115%;font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-ansi-language:en-us;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-fareast-language:en-us;mso-bidi-language:ar-sa;mso-no-proof:yes;"&gt; &lt;span style="color:blue;"&gt;BY&lt;/span&gt; [Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[OrderDate] &lt;span style="color:blue;"&gt;ASC&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[OrderID] &lt;span style="color:blue;"&gt;ASC&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[CustomerID1] &lt;span style="color:blue;"&gt;ASC&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Project1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[C1] &lt;span style="color:blue;"&gt;ASC&lt;/span&gt;&lt;/span&gt;   &lt;p&gt;If we comment the Include, the SQL query is more readable &lt;img src="http://msmvps.com/emoticons/emotion-1.gif" alt="Smile" /&gt; :&lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;SELECT&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt; &lt;span style="color:blue;"&gt;TOP &lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;1&lt;span style="color:gray;"&gt;)&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[OrderID] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [OrderID]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[CustomerID] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [CustomerID]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[EmployeeID] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [EmployeeID]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[OrderDate] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [OrderDate]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[RequiredDate] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [RequiredDate]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShippedDate] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShippedDate]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipVia] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipVia]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Freight] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Freight]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipName] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipName]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipAddress] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipAddress]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipCity] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipCity]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipRegion] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipRegion]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipPostalCode] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipPostalCode]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipCountry] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipCountry]       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;FROM &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:10pt;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt; &lt;span style="color:blue;"&gt;SELECT&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[OrderID] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [OrderID]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[CustomerID] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [CustomerID]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[EmployeeID] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [EmployeeID]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[OrderDate] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [OrderDate]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[RequiredDate] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [RequiredDate]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShippedDate] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShippedDate]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipVia] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipVia]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Freight] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Freight]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipName] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipName]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipAddress] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipAddress]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipCity] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipCity]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipRegion] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipRegion]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipPostalCode] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipPostalCode]&lt;span style="color:gray;"&gt;,&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipCountry] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipCountry]&lt;span style="color:gray;"&gt;,&lt;/span&gt; &lt;span style="color:fuchsia;"&gt;row_number&lt;/span&gt;&lt;span style="color:gray;"&gt;()&lt;/span&gt; &lt;span style="color:blue;"&gt;OVER &lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:blue;"&gt;ORDER&lt;/span&gt; &lt;span style="color:blue;"&gt;BY&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[OrderDate] &lt;span style="color:blue;"&gt;ASC&lt;/span&gt;&lt;span style="color:gray;"&gt;)&lt;/span&gt; &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [row_number]       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;FROM&lt;/span&gt; [dbo]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Orders] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Extent1]       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;WHERE&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipCity] &lt;span style="color:gray;"&gt;=&lt;/span&gt; &lt;span style="color:red;"&gt;&amp;#39;PARIS&amp;#39;        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:10pt;mso-no-proof:yes;"&gt;)&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Filter1]       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;WHERE&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[row_number] &lt;span style="color:gray;"&gt;&amp;gt;&lt;/span&gt; 2 &lt;/span&gt;    &lt;p&gt;&lt;/p&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt; &lt;span style="line-height:115%;font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-ansi-language:en-us;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-fareast-language:en-us;mso-bidi-language:ar-sa;mso-no-proof:yes;"&gt;ORDER&lt;/span&gt;&lt;span style="line-height:115%;font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-ansi-language:en-us;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-fareast-language:en-us;mso-bidi-language:ar-sa;mso-no-proof:yes;"&gt; &lt;span style="color:blue;"&gt;BY&lt;/span&gt; [Filter1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[OrderDate] &lt;span style="color:blue;"&gt;ASC&lt;/span&gt;&lt;/span&gt;   &lt;p&gt;We can find our WHERE City = ‘Paris’, our WHERE row_number &amp;gt; 2 (for the Skip), out ORDER BY OrderDate and our TOP&amp;#160; 1 (for the First).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Take care, this “sort of” provider LINQ is a POC. It is not finished. For example, it doesn’t support variables or the new operator (for date for example). &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;What happens if we integrate methods non supported by ClientLINQ?&lt;/p&gt;  &lt;p&gt;It’s ok! &lt;img src="http://msmvps.com/emoticons/emotion-1.gif" alt="Smile" /&gt;&lt;/p&gt;  &lt;p&gt;LINQ To Object will be used.&lt;/p&gt;  &lt;p&gt;For example, the following LINQ query:&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="line-height:115%;font-family:consolas;color:blue;mso-ansi-language:en;mso-bidi-font-size:9.5pt;" lang="EN"&gt;var&lt;/span&gt;&lt;span style="line-height:115%;font-family:consolas;mso-ansi-language:en;mso-bidi-font-size:9.5pt;" lang="EN"&gt; customerInfos = (&lt;span style="color:blue;"&gt;from&lt;/span&gt; o &lt;span style="color:blue;"&gt;in&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;NorthwindClientContext&lt;/span&gt;(service).Orders.Include(&lt;span style="color:#a31515;"&gt;&amp;quot;Customer&amp;quot;&lt;/span&gt;)       &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;where&lt;/span&gt; o.ShipCity == &lt;span style="color:#a31515;"&gt;&amp;quot;PARIS&amp;quot;        &lt;br /&gt;&lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;orderby&lt;/span&gt; o.OrderDate       &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;group&lt;/span&gt; o &lt;span style="color:blue;"&gt;by&lt;/span&gt; o.Customer &lt;span style="color:blue;"&gt;into&lt;/span&gt; g&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="line-height:115%;font-family:consolas;mso-bidi-font-size:9.5pt;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;select&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; { g.Key.CompanyName, g.Key.ContactName, OrdersCount = g.Count() }).ToList();&lt;/span&gt;    &lt;p&gt;&lt;/p&gt; &lt;/p&gt;  &lt;p&gt;will call this method &lt;/p&gt;  &lt;p&gt;_service.GetOrders(myQueryable.IncludeValues.ToList(), myQueryable.WhereValue, myQueryable.OrderByValue, myQueryable.SkipValue, myQueryable.TakeValue)&lt;/p&gt;  &lt;p&gt;with these parameters:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.metablogapi/2117.image_5F00_02D1564E.png"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.metablogapi/3107.image_5F00_thumb_5F00_13D58431.png" width="412" height="164" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;which will generate the following SQL query:&lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;SELECT&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[OrderID] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [OrderID]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[CustomerID] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [CustomerID]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[EmployeeID] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [EmployeeID]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[OrderDate] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [OrderDate]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[RequiredDate] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [RequiredDate]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShippedDate] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShippedDate]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipVia] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipVia]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Freight] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Freight]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipName] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipName]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipAddress] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipAddress]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipCity] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipCity]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipRegion] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipRegion]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipPostalCode] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipPostalCode]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipCountry] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ShipCountry]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Extent2]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[CustomerID] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [CustomerID1]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Extent2]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[CompanyName] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [CompanyName]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Extent2]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ContactName] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ContactName]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Extent2]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ContactTitle] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [ContactTitle]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Extent2]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Address] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Address]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Extent2]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[City] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [City]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Extent2]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Region] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Region]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Extent2]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[PostalCode] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [PostalCode]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Extent2]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Country] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Country]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Extent2]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Phone] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Phone]&lt;span style="color:gray;"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Extent2]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Fax] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Fax]       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;FROM&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;/span&gt;[dbo]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Orders] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Extent1]       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:10pt;mso-no-proof:yes;"&gt;LEFT&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt; &lt;span style="color:gray;"&gt;OUTER&lt;/span&gt; &lt;span style="color:gray;"&gt;JOIN&lt;/span&gt; [dbo]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Customers] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Extent2] &lt;span style="color:blue;"&gt;ON&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[CustomerID] &lt;span style="color:gray;"&gt;=&lt;/span&gt; [Extent2]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[CustomerID]       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;WHERE&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShipCity] &lt;span style="color:gray;"&gt;=&lt;/span&gt; &lt;span style="color:red;"&gt;&amp;#39;PARIS&amp;#39;        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;ORDER&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt; &lt;span style="color:blue;"&gt;BY&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[OrderDate] &lt;span style="color:blue;"&gt;ASC&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;    &lt;p&gt;&lt;/p&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;As you can see, no trace of group by. However, the result integrates it (with LINQ To Object).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;In this post, I wanted to present my “sort of&amp;#39;” LINQ provider but the real goal of this post is to persuade you (and I’m sure you are &lt;img src="http://msmvps.com/emoticons/emotion-1.gif" alt="Smile" /&gt;) of the EF / T4 couple productivity gain. Indeed, &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;your templates are reusable in different projects. You just have to update the edmx path and to let Visual Studio regenerate T4 templates code. &lt;/li&gt;    &lt;li&gt;If you haven&amp;#39;t already written the template you need, the dev time is not proportional to the number of entities which implies very quickly a productivity gain compare to a “classic” dev. &lt;/li&gt; &lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1742036" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/matthieu/archive/tags/.Net/default.aspx">.Net</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/Entity+Framework+_2800_EF_2900_/default.aspx">Entity Framework (EF)</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/Entity+Data+Model+_2800_EDM_2900_/default.aspx">Entity Data Model (EDM)</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/T4/default.aspx">T4</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/TDD/default.aspx">TDD</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>4 in 1: EF won’t fire DBAs, Velocity, SQL CLR and SQL Dependency</title><link>http://msmvps.com/blogs/matthieu/archive/2009/11/21/4-in-1-ef-won-t-fire-dbas-velocity-sql-clr-and-sql-dependency.aspx</link><pubDate>Sat, 21 Nov 2009 15:42:16 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1741356</guid><dc:creator>Matthieu MEZIL</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/rsscomments.aspx?PostID=1741356</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/commentapi.aspx?PostID=1741356</wfw:comment><comments>http://msmvps.com/blogs/matthieu/archive/2009/11/21/4-in-1-ef-won-t-fire-dbas-velocity-sql-clr-and-sql-dependency.aspx#comments</comments><description>&lt;p&gt;Imagine that we have a table Cars with a PK Id (nvarchar(8)) based on the following regex pattern [1-9][0-9]{1,2}[A-Z]{2,3}[0-9]{2}. The last two numbers are a region code.&lt;/p&gt;  &lt;p&gt;The increasement is done like this: 10AA[region], 11AA[region], …, 999AA[region], 10AB[region], …, 999ZZ[region], 10AAA[region], …, 999ZZZ[region]&lt;/p&gt;  &lt;p&gt;This table can be huge.&lt;/p&gt;  &lt;p&gt;In a first time, we will write a LINQ To Entities query to get regions with 3 letters:&lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:consolas;color:blue;font-size:11pt;"&gt;var&lt;/span&gt;&lt;span style="font-family:consolas;font-size:11pt;"&gt; q1 = (&lt;span style="color:blue;"&gt;from&lt;/span&gt; c &lt;span style="color:blue;"&gt;in&lt;/span&gt; context.Cars       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:11pt;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;where&lt;/span&gt; c.Id.Contains(&lt;span style="color:#a31515;"&gt;&amp;quot;AAA&amp;quot;&lt;/span&gt;)       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:11pt;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;select&lt;/span&gt; c.Id.Substring(c.Id.Length - &lt;span style="color:brown;"&gt;2&lt;/span&gt;)).Distinct();       &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;The SQL generated query is the following:&lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;SELECT&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Distinct1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[C1] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [C1]       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;FROM &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:10pt;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt; &lt;span style="color:blue;"&gt;SELECT&lt;/span&gt; &lt;span style="color:blue;"&gt;DISTINCT&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:fuchsia;"&gt;SUBSTRING&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;[Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ Id ]&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;((&lt;/span&gt;&lt;span style="color:fuchsia;"&gt;LEN&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;[Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ Id ]&lt;span style="color:gray;"&gt;))&lt;/span&gt; &lt;span style="color:gray;"&gt;-&lt;/span&gt; 2&lt;span style="color:gray;"&gt;)&lt;/span&gt; &lt;span style="color:gray;"&gt;+&lt;/span&gt; 1&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:fuchsia;"&gt;LEN&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;[Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ Id ]&lt;span style="color:gray;"&gt;))&lt;/span&gt; &lt;span style="color:gray;"&gt;-&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;((&lt;/span&gt;&lt;span style="color:fuchsia;"&gt;LEN&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;[Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ Id ]&lt;span style="color:gray;"&gt;))&lt;/span&gt; &lt;span style="color:gray;"&gt;-&lt;/span&gt; 2&lt;span style="color:gray;"&gt;))&lt;/span&gt; &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [C1]     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;FROM&lt;/span&gt; [dbo]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Cars] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Extent1]     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;WHERE&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ Id ] &lt;span style="color:gray;"&gt;LIKE&lt;/span&gt; &lt;span style="color:red;"&gt;N&amp;#39;%AAA%&amp;#39;      &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="line-height:115%;font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:10pt;mso-no-proof:yes;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt;)&lt;/span&gt;&lt;span style="line-height:115%;font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Distinct1]&lt;/span&gt;   &lt;p&gt;If I write it myself, I would probably write this:&lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;SELECT&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt; &lt;span style="color:blue;"&gt;DISTINCT&lt;/span&gt;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:gray;"&gt;RIGHT(&lt;/span&gt;Id&lt;span style="color:gray;"&gt;,&lt;/span&gt; 2&lt;span style="color:gray;"&gt;)&lt;/span&gt; &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [C1]       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;FROM&lt;/span&gt; [Cars]       &lt;br /&gt;&lt;/span&gt;&lt;span style="line-height:115%;font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;WHERE&lt;/span&gt; [ Id ] &lt;span style="color:gray;"&gt;LIKE&lt;/span&gt; &lt;span style="color:red;"&gt;N&amp;#39;%AAA%&amp;#39;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;  &lt;p&gt;Note that the execution plan is the same!&lt;/p&gt;  &lt;p&gt;Imagine that the DBA wants that I use the RIGHT function. With EF4, we can do it.&lt;/p&gt;  &lt;p&gt;The Right doesn’t exist in C# but it does in ESQL. So we will use CSDL Functions.&lt;/p&gt;  &lt;p&gt;In the CSDL, we will add the following code:&lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:consolas;color:blue;font-size:11pt;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family:consolas;color:#a31515;font-size:11pt;"&gt;Function&lt;/span&gt;&lt;span style="font-family:consolas;color:blue;font-size:11pt;"&gt; &lt;/span&gt;&lt;span style="font-family:consolas;color:red;font-size:11pt;"&gt;Name&lt;/span&gt;&lt;span style="font-family:consolas;color:blue;font-size:11pt;"&gt;=&lt;/span&gt;&lt;span style="font-family:consolas;font-size:11pt;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;GetRegion&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;ReturnType&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;String&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;color:blue;font-size:11pt;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family:consolas;color:#a31515;font-size:11pt;"&gt;Parameter&lt;/span&gt;&lt;span style="font-family:consolas;color:blue;font-size:11pt;"&gt; &lt;/span&gt;&lt;span style="font-family:consolas;color:red;font-size:11pt;"&gt;Name&lt;/span&gt;&lt;span style="font-family:consolas;color:blue;font-size:11pt;"&gt;=&lt;/span&gt;&lt;span style="font-family:consolas;font-size:11pt;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;car&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Self.Car&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; /&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;color:blue;font-size:11pt;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family:consolas;color:#a31515;font-size:11pt;"&gt;DefiningExpression&lt;/span&gt;&lt;span style="font-family:consolas;color:blue;font-size:11pt;"&gt;&amp;gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:11pt;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;Right(car.Id, 2)       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;color:blue;font-size:11pt;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family:consolas;color:#a31515;font-size:11pt;"&gt;DefiningExpression&lt;/span&gt;&lt;span style="font-family:consolas;color:blue;font-size:11pt;"&gt;&amp;gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="line-height:115%;font-family:consolas;color:blue;font-size:11pt;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="line-height:115%;font-family:consolas;color:#a31515;font-size:11pt;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt;Function&lt;/span&gt;&lt;span style="line-height:115%;font-family:consolas;color:blue;font-size:11pt;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt;&amp;gt;&lt;/span&gt; &lt;/p&gt;  &lt;p&gt;Then,we will add an extension method to be able to use it in our LINQ To Entities queries:&lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:consolas;color:blue;font-size:11pt;"&gt;public&lt;/span&gt;&lt;span style="font-family:consolas;font-size:11pt;"&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CarExtension        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:11pt;"&gt;{      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:11pt;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[&lt;span style="color:#2b91af;"&gt;EdmFunction&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;CarsModel&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;GetRegion&amp;quot;&lt;/span&gt;)]&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:11pt;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; GetRegion(&lt;span style="color:blue;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Car&lt;/span&gt; car)       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:11pt;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:11pt;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;throw&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;NotImplementedException&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Only used by LINQ To Entities&amp;quot;&lt;/span&gt;);       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:11pt;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}       &lt;br /&gt;&lt;/span&gt;&lt;span style="line-height:115%;font-family:consolas;font-size:11pt;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt;}&lt;/span&gt; &lt;/p&gt;  &lt;p&gt;I now can write my query like this:&lt;/p&gt; &lt;span style="font-family:consolas;color:blue;font-size:11pt;"&gt;var&lt;/span&gt;&lt;span style="font-family:consolas;font-size:11pt;"&gt; q1 = (&lt;span style="color:blue;"&gt;from&lt;/span&gt; c &lt;span style="color:blue;"&gt;in&lt;/span&gt; context.Cars     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:11pt;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;where&lt;/span&gt; c.Id.Contains(&lt;span style="color:#a31515;"&gt;&amp;quot;AAA&amp;quot;&lt;/span&gt;)     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:11pt;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;select&lt;/span&gt; c.GetRegion()).Distinct();     &lt;br /&gt;&lt;/span&gt;  &lt;p&gt;This LINQ query is translated as the following SQL query:&lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;SELECT&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt; &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;[Distinct1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[C1] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [C1] &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;FROM &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:10pt;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt; &lt;span style="color:blue;"&gt;SELECT&lt;/span&gt; &lt;span style="color:blue;"&gt;DISTINCT&lt;/span&gt; &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:gray;"&gt;RIGHT(&lt;/span&gt;[Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ Id ]&lt;span style="color:gray;"&gt;,&lt;/span&gt; 2&lt;span style="color:gray;"&gt;)&lt;/span&gt; &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [C1] &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;FROM&lt;/span&gt; [dbo]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Cars] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Extent1] &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;WHERE&lt;/span&gt; [Extent1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ Id ] &lt;span style="color:gray;"&gt;LIKE&lt;/span&gt; &lt;span style="color:red;"&gt;N&amp;#39;%AAA%&amp;#39; &lt;/span&gt;&lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:10pt;mso-no-proof:yes;"&gt;)&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;AS&lt;/span&gt; [Distinct1]&lt;/span&gt;&lt;span style="font-family:consolas;font-size:11pt;"&gt; &lt;/span&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Cool!&lt;/p&gt;  &lt;p&gt;Now I want to get the last Id per region. I don’t think that there is a clean way to do it with SQL. Indeed, I don’t think that we can use Regex in SQL Server and we need it to determine which is the last id.&lt;/p&gt;  &lt;p&gt;So to do this, I will use a LINQ To Object query. The “normal” way can be to write this:&lt;/p&gt; &lt;span style="line-height:115%;font-family:consolas;color:blue;font-size:11pt;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:en;mso-fareast-language:en-us;mso-bidi-language:ar-sa;" lang="EN"&gt;var&lt;/span&gt;&lt;span style="line-height:115%;font-family:consolas;font-size:11pt;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:en;mso-fareast-language:en-us;mso-bidi-language:ar-sa;" lang="EN"&gt; qL2E = &lt;span style="color:blue;"&gt;from&lt;/span&gt; c &lt;span style="color:blue;"&gt;in&lt;/span&gt; context.Cars     &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;orderby&lt;/span&gt; c.GetRegion()     &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;select&lt;/span&gt; c.Id;     &lt;br /&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; qL2O = &lt;span style="color:blue;"&gt;from&lt;/span&gt; id &lt;span style="color:blue;"&gt;in&lt;/span&gt; qL2E.AsEnumerable()     &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;group&lt;/span&gt; id &lt;span style="color:blue;"&gt;by&lt;/span&gt; id.Substring(id.Length - &lt;span style="color:brown;"&gt;2&lt;/span&gt;) &lt;span style="color:blue;"&gt;into&lt;/span&gt; g     &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;select&lt;/span&gt; &lt;span style="color:blue;"&gt;new      &lt;br /&gt;&lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;Region = g.Key,     &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;Id = (&lt;span style="color:blue;"&gt;from&lt;/span&gt; id &lt;span style="color:blue;"&gt;in&lt;/span&gt; g     &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;let&lt;/span&gt; letters = &lt;span style="color:#2b91af;"&gt;Regex&lt;/span&gt;.Match(id, &lt;span style="color:#a31515;"&gt;&amp;quot;[A-Z]{2,3}&amp;quot;&lt;/span&gt;)     &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;orderby&lt;/span&gt; letters.Length &lt;span style="color:blue;"&gt;descending&lt;/span&gt;, letters &lt;span style="color:blue;"&gt;descending&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;Regex&lt;/span&gt;.Match(id, &lt;span style="color:#a31515;"&gt;&amp;quot;^[0-9]{2,3}&amp;quot;&lt;/span&gt;) &lt;span style="color:blue;"&gt;descending      &lt;br /&gt;&lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;select&lt;/span&gt; id).FirstOrDefault()     &lt;br /&gt;&lt;/span&gt;&lt;span style="line-height:115%;font-family:consolas;font-size:11pt;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}.ToDictionary(id =&amp;gt; id.Region, id =&amp;gt; id.Id);&lt;/span&gt;   &lt;p&gt;However, with this way, we will probably have an OutOfMemoryException. Indeed, with this query, all the Cars records are loaded in memory and we can have hundreds millions of rows.&lt;/p&gt;  &lt;p&gt;In a first time, we will try a dichotomous approach. &lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:consolas;color:blue;"&gt;var&lt;/span&gt;&lt;span style="font-family:consolas;"&gt; ids = (&lt;span style="color:blue;"&gt;from&lt;/span&gt; c &lt;span style="color:blue;"&gt;in&lt;/span&gt; context.Cars &lt;/span&gt;    &lt;br /&gt;&lt;span style="line-height:115%;font-family:consolas;font-size:11pt;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;select&lt;/span&gt; c.GetRegion()).Distinct().AsEnumerable().ToDictionary(region =&amp;gt; region, region =&amp;gt; GetLastId(region, &lt;span style="color:#a31515;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;, (&lt;span style="color:blue;"&gt;new&lt;/span&gt;[] { &lt;span style="color:#a31515;"&gt;&amp;quot;&amp;quot;&lt;/span&gt; }.Union(&lt;span style="color:#2b91af;"&gt;Enumerable&lt;/span&gt;.Range(&lt;span style="color:#a31515;"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;, &lt;span style="color:brown;"&gt;26&lt;/span&gt;).Select(i =&amp;gt; &lt;span style="color:blue;"&gt;char&lt;/span&gt;.ConvertFromUtf32(i)))), &lt;span style="color:brown;"&gt;0&lt;/span&gt;));&lt;/span&gt;     &lt;br /&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;color:blue;"&gt;private&lt;/span&gt;&lt;span style="font-family:consolas;"&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; GetLastId(&lt;span style="color:blue;"&gt;string&lt;/span&gt; region, &lt;span style="color:blue;"&gt;string&lt;/span&gt; letters, &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; possibleChars, &lt;span style="color:blue;"&gt;int&lt;/span&gt; index) &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;{ &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (!possibleChars.Skip(&lt;span style="color:brown;"&gt;1&lt;/span&gt;).Any()) &lt;span style="color:green;"&gt;// Count() == 1 &lt;/span&gt;&lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{ &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;letters += possibleChars.First(); &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (++index == &lt;span style="color:brown;"&gt;3&lt;/span&gt;) &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{ &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; context = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CarsContainer&lt;/span&gt;()) &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{ &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;return &lt;/span&gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;(&lt;span style="color:blue;"&gt;from&lt;/span&gt; c &lt;span style="color:blue;"&gt;in&lt;/span&gt; context.Cars &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;where&lt;/span&gt; c.Id.EndsWith(letters + region) &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;orderby&lt;/span&gt; c.Id.IndexOf(letters) &lt;span style="color:blue;"&gt;descending&lt;/span&gt;, c.Id &lt;span style="color:blue;"&gt;descending &lt;/span&gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;select&lt;/span&gt; c.Id).FirstOrDefault(); &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;} &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;} &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; GetLastId(region, letters, &lt;span style="color:#2b91af;"&gt;Enumerable&lt;/span&gt;.Range(&lt;span style="color:#a31515;"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;, &lt;span style="color:brown;"&gt;26&lt;/span&gt;).Select(i =&amp;gt; &lt;span style="color:blue;"&gt;char&lt;/span&gt;.ConvertFromUtf32(i)), index); &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;} &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;else &lt;/span&gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{ &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; possibleCharsList = possibleChars.ToList(); &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;int&lt;/span&gt; middle = possibleCharsList.Count / &lt;span style="color:brown;"&gt;2&lt;/span&gt;; &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; context = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CarsContainer&lt;/span&gt;()) &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{ &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; idBeginning = &lt;span style="color:blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;&amp;quot;10{0}{1}{2}&amp;quot;&lt;/span&gt;, letters, possibleCharsList[middle], &lt;span style="color:#a31515;"&gt;&amp;quot;AA&amp;quot;&lt;/span&gt;.Substring(index)); &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; ((&lt;span style="color:blue;"&gt;from&lt;/span&gt; c &lt;span style="color:blue;"&gt;in&lt;/span&gt; context.Cars &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;where&lt;/span&gt; c.Id.StartsWith(idBeginning) &amp;amp;&amp;amp; c.Id.EndsWith(region) &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;select&lt;/span&gt; c.Id).Any()) &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; GetLastId(region, letters, possibleCharsList.Skip(middle), index); &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; GetLastId(region, letters, possibleCharsList.Take(middle), index); &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;} &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;} &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;"&gt;} &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;The execution of this query is very slow (26 minutes and 18 seconds in my test with 562 012 347 records).&lt;/p&gt;  &lt;p&gt;So what can we do?&lt;/p&gt;  &lt;p&gt;The CPU is used by the DB at 100% and the slowly is only because of the DB. So it useless to imagine to parallelize our code.&lt;/p&gt;  &lt;p&gt;We can imagine to resize the Data Base server but it is not the goal of this post.&lt;/p&gt;  &lt;p&gt;In our case, the DBA (I specify that I am not a DBA) will probably want to change the Cars table schema in order to split into 3 columns the Id. However, in a lot of cases, it can be interesting to keep the Id column, which keeps the PK. Indeed, imagine that we have some existing applications. The idea is to add these columns with no impact on them.&lt;/p&gt;  &lt;p&gt;So we will have four columns (all not nullable) : &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Id &lt;/li&gt;    &lt;li&gt;Number &lt;/li&gt;    &lt;li&gt;Letters &lt;/li&gt;    &lt;li&gt;Region &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;To set them, we will use CLR functions:&lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;mso-margin-top-alt:auto;" class="MsoNormal"&gt;&lt;span style="font-family:consolas;color:blue;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-ansi-language:en;" lang="EN"&gt;public&lt;/span&gt;&lt;span style="font-family:consolas;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-ansi-language:en;" lang="EN"&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CarsFunction        &lt;br /&gt;&lt;/span&gt;{       &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[&lt;span style="color:#2b91af;"&gt;SqlFunction&lt;/span&gt;]       &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SqlInt16&lt;/span&gt; GetNumber(&lt;span style="color:#2b91af;"&gt;SqlString&lt;/span&gt; id)       &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{       &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SqlInt16&lt;/span&gt;(&lt;span style="color:blue;"&gt;short&lt;/span&gt;.Parse(&lt;span style="color:#2b91af;"&gt;Regex&lt;/span&gt;.Match(id.Value, &lt;span style="color:#a31515;"&gt;&amp;quot;^[0-9]{2,3}&amp;quot;&lt;/span&gt;).Value));       &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}&amp;#160; &lt;br /&gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-ansi-language:en;" lang="EN"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[&lt;span style="color:#2b91af;"&gt;SqlFunction&lt;/span&gt;]       &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SqlString&lt;/span&gt; GetLetters(&lt;span style="color:#2b91af;"&gt;SqlString&lt;/span&gt; id)       &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{       &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SqlString&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;Regex&lt;/span&gt;.Match(id.Value, &lt;span style="color:#a31515;"&gt;&amp;quot;[A-Z]{2,3}&amp;quot;&lt;/span&gt;).Value);       &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}&amp;#160; &lt;br /&gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-ansi-language:en;" lang="EN"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;[&lt;span style="color:#2b91af;"&gt;SqlFunction&lt;/span&gt;]       &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SqlInt16&lt;/span&gt; GetRegion(&lt;span style="color:#2b91af;"&gt;SqlString&lt;/span&gt; id)       &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{       &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SqlInt16&lt;/span&gt;(&lt;span style="color:blue;"&gt;short&lt;/span&gt;.Parse(&lt;span style="color:#2b91af;"&gt;Regex&lt;/span&gt;.Match(id.Value, &lt;span style="color:#a31515;"&gt;&amp;quot;[0-9]{2}$&amp;quot;&lt;/span&gt;).Value));       &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;}&lt;/span&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;Then, in the DB, we will register the assembly and we will create some SQL functions from previous ones: &lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;CREATE&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt; &lt;span style="color:blue;"&gt;ASSEMBLY&lt;/span&gt; CarsFunctionsAssembly       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;FROM&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt; &lt;span style="color:red;"&gt;&amp;#39;D:\documents\visual studio 2010\Projects\CarsFunctions\CarsFunctions\bin\Debug\CarsFunctions.dll&amp;#39;        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;GO&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&amp;#160; &lt;/span&gt;&amp;#160; &lt;br /&gt;    &lt;br /&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;CREATE&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt; &lt;span style="color:blue;"&gt;FUNCTION&lt;/span&gt; GetNumber&lt;span style="color:gray;"&gt;(&lt;/span&gt;@id &lt;span style="color:blue;"&gt;AS&lt;/span&gt; &lt;span style="color:blue;"&gt;nvarchar&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;8&lt;span style="color:gray;"&gt;))&lt;/span&gt; &lt;span style="color:blue;"&gt;RETURNS&lt;/span&gt; &lt;span style="color:blue;"&gt;smallint&lt;/span&gt; &lt;span style="color:blue;"&gt;AS&lt;/span&gt; &lt;span style="color:blue;"&gt;EXTERNAL&lt;/span&gt; NAME CarsFunctionsAssembly&lt;span style="color:gray;"&gt;.&lt;/span&gt;CarsFunction&lt;span style="color:gray;"&gt;.&lt;/span&gt;GetNumber       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;GO      &lt;br /&gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;CREATE&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt; &lt;span style="color:blue;"&gt;FUNCTION&lt;/span&gt; GetLetters&lt;span style="color:gray;"&gt;(&lt;/span&gt;@id &lt;span style="color:blue;"&gt;AS&lt;/span&gt; &lt;span style="color:blue;"&gt;nvarchar&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;8&lt;span style="color:gray;"&gt;))&lt;/span&gt; &lt;span style="color:blue;"&gt;RETURNS&lt;/span&gt; &lt;span style="color:blue;"&gt;nvarchar&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;3&lt;span style="color:gray;"&gt;)&lt;/span&gt; &lt;span style="color:blue;"&gt;AS&lt;/span&gt; &lt;span style="color:blue;"&gt;EXTERNAL&lt;/span&gt; NAME CarsFunctionsAssembly&lt;span style="color:gray;"&gt;.&lt;/span&gt;CarsFunction&lt;span style="color:gray;"&gt;.&lt;/span&gt;GetLetters       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;GO      &lt;br /&gt;&lt;/span&gt;&lt;span style="line-height:115%;font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;     &lt;br /&gt;CREATE&lt;/span&gt;&lt;span style="line-height:115%;font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt; &lt;span style="color:blue;"&gt;FUNCTION&lt;/span&gt; GetRegion&lt;span style="color:gray;"&gt;(&lt;/span&gt;@id &lt;span style="color:blue;"&gt;AS&lt;/span&gt; &lt;span style="color:blue;"&gt;nvarchar&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;8&lt;span style="color:gray;"&gt;))&lt;/span&gt; &lt;span style="color:blue;"&gt;RETURNS&lt;/span&gt; &lt;span style="color:blue;"&gt;smallint&lt;/span&gt; &lt;span style="color:blue;"&gt;AS&lt;/span&gt; &lt;span style="color:blue;"&gt;EXTERNAL&lt;/span&gt; NAME CarsFunctionsAssembly&lt;span style="color:gray;"&gt;.&lt;/span&gt;CarsFunction&lt;span style="color:gray;"&gt;.&lt;/span&gt;GetRegion&lt;/span&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Ok, we have the functions, so we can be back on the new columns creation. Instead of creating “normal” columns, we will use computed columns. We can do it with the SSMS designer by setting the Computed Column Specification Formula to dbo.GetNumber(Id) (resp dbo.GetLetters(Id), dbo.GetRegion(Id)). In our case, the idea isn’t to calculate them each time but to keep their values. So we will set the “Is Persisted” property to true.&lt;/p&gt;  &lt;p&gt;But there is an issue: the function has to be deterministic. Our function is. However, because it is a CLR function, SQL Server can’t know it. So we will tell it explicitly.&lt;/p&gt;  &lt;p&gt;To do this, we will change the CLR functions code like this:&lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:consolas;"&gt;[&lt;span style="color:#2b91af;"&gt;SqlFunction&lt;/span&gt;(IsDeterministic = &lt;span style="color:blue;"&gt;true&lt;/span&gt;, IsPrecise = &lt;span style="color:blue;"&gt;true&lt;/span&gt;)]       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;color:blue;"&gt;public&lt;/span&gt;&lt;span style="font-family:consolas;"&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SqlInt16&lt;/span&gt; GetNumber(&lt;span style="color:#2b91af;"&gt;SqlString&lt;/span&gt; id)       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;{      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SqlInt16&lt;/span&gt;(&lt;span style="color:blue;"&gt;short&lt;/span&gt;.Parse(&lt;span style="color:#2b91af;"&gt;Regex&lt;/span&gt;.Match(id.Value, &lt;span style="color:#a31515;"&gt;&amp;quot;^[0-9]{2,3}&amp;quot;&lt;/span&gt;).Value));       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;}      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;     &lt;br /&gt;[&lt;span style="color:#2b91af;"&gt;SqlFunction&lt;/span&gt;(IsDeterministic = &lt;span style="color:blue;"&gt;true&lt;/span&gt;, IsPrecise = &lt;span style="color:blue;"&gt;true&lt;/span&gt;)]       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;color:blue;"&gt;public&lt;/span&gt;&lt;span style="font-family:consolas;"&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SqlString&lt;/span&gt; GetLetters(&lt;span style="color:#2b91af;"&gt;SqlString&lt;/span&gt; id)       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;{      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SqlString&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;Regex&lt;/span&gt;.Match(id.Value, &lt;span style="color:#a31515;"&gt;&amp;quot;[A-Z]{2,3}&amp;quot;&lt;/span&gt;).Value);       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;}      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;     &lt;br /&gt;[&lt;span style="color:#2b91af;"&gt;SqlFunction&lt;/span&gt;(IsDeterministic = &lt;span style="color:blue;"&gt;true&lt;/span&gt;, IsPrecise = &lt;span style="color:blue;"&gt;true&lt;/span&gt;)]       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;color:blue;"&gt;public&lt;/span&gt;&lt;span style="font-family:consolas;"&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SqlInt16&lt;/span&gt; GetRegion(&lt;span style="color:#2b91af;"&gt;SqlString&lt;/span&gt; id)       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;{      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SqlInt16&lt;/span&gt;(&lt;span style="color:blue;"&gt;short&lt;/span&gt;.Parse(&lt;span style="color:#2b91af;"&gt;Regex&lt;/span&gt;.Match(id.Value, &lt;span style="color:#a31515;"&gt;&amp;quot;[0-9]{2}$&amp;quot;&lt;/span&gt;).Value));       &lt;br /&gt;&lt;/span&gt;&lt;span style="line-height:115%;font-family:consolas;font-size:11pt;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt;}&lt;/span&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Now, we can persist the three columns.&lt;/p&gt;  &lt;p&gt;Be careful, if we create an edmx from the DB, we will have a StoreGeneratedPattern=&amp;quot;Computed&amp;quot; on the columns Number, Letters and Region. It implies that in each update, EF, we reload the properties Number, Letters et Region. In our case, the calculation is only done on the key. With Entity Framework, it is not possible to change the value of the key. So, it is useful to change the StoreGeneratedPattern from Computed to Identity.&lt;/p&gt;  &lt;p&gt;Cool, we have fixed the INSERT issue.&lt;/p&gt;  &lt;p&gt;Let’s now concentrate on the goal: our query.&lt;/p&gt;  &lt;p&gt;We don’t need a dichotomous approach, a simple LINQ To Entities query is enough:&lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:consolas;color:blue;"&gt;var&lt;/span&gt;&lt;span style="font-family:consolas;"&gt; ids = (&lt;span style="color:blue;"&gt;from&lt;/span&gt; c &lt;span style="color:blue;"&gt;in&lt;/span&gt; context.Cars       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;group&lt;/span&gt; c &lt;span style="color:blue;"&gt;by&lt;/span&gt; c.Region &lt;span style="color:blue;"&gt;into&lt;/span&gt; g       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;select&lt;/span&gt; &lt;span style="color:blue;"&gt;new        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;Region = g.Key,       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;LastId = (&lt;span style="color:blue;"&gt;from&lt;/span&gt; c &lt;span style="color:blue;"&gt;in&lt;/span&gt; g       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;orderby&lt;/span&gt; c.Letters.Length &lt;span style="color:blue;"&gt;descending&lt;/span&gt;, c.Letters &lt;span style="color:blue;"&gt;descending&lt;/span&gt;, c.Number &lt;span style="color:blue;"&gt;descending        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;select&lt;/span&gt; c.Id).FirstOrDefault()&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="line-height:115%;font-family:consolas;font-size:11pt;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}).AsEnumerable().ToDictionary(region =&amp;gt; region.Region, region =&amp;gt; region.LastId);&lt;/span&gt; &lt;/p&gt;  &lt;p&gt;With this, our query runs in 1 minute and 42 seconds instead of 26 minutes and 18 seconds! &lt;/p&gt;  &lt;p&gt;It’s better but it isn’t finished yet.&lt;/p&gt;  &lt;p&gt;In the DB, we will set the Cars table cluster on the Region column (instead of the Id column).&lt;/p&gt;  &lt;p&gt;In this case, the query execution falls to 12 seconds!&lt;/p&gt;  &lt;p&gt;However, be careful! It’s really great in our sample but in the real life, don’t forget to study all the DB query on the table Cars before changing the cluster. &lt;/p&gt;  &lt;p&gt;So the DBA role is important in the success of the project.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Now, imagine that we want to keep in cache the last id per region. To do it, we can use a static Dictionary. But there are two issues: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Imagine a N-Tiers scenario. If our application is deployed on more than one frontal server, it’s a shame to have to initialize the cache for each of them. Moreover, we have to maintain each of them with the last values &lt;/li&gt;    &lt;li&gt;If another application adds or removes a car in the DB, how to maintain our cache with the last values? &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;To fix the first issue, we will Velocity. For the second, we will use SQLDependency.&lt;/p&gt;  &lt;p&gt;Velocity is a distributed cache which allows a lot of very interesting things like load balancing. This distributed cache will be shared by all the frontal servers. It means that we won”t have to manage one cache per server.&lt;/p&gt;  &lt;p&gt;What do we have to do to use Velocity? First point: &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=B24C3708-EEFF-4055-A867-19B5851E7CD2&amp;amp;displaylang=en" target="_blank"&gt;download it&lt;/a&gt; and install it.&lt;img src="http://msmvps.com/emoticons/emotion-1.gif" alt="Smile" /&gt;&lt;/p&gt;  &lt;p&gt;When the installation is done, we will add the following references in our project: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;CacheBaseLibrary.dll &lt;/li&gt;    &lt;li&gt;CASBase.dll &lt;/li&gt;    &lt;li&gt;CASMain.dll &lt;/li&gt;    &lt;li&gt;ClientLibrary.dll &lt;/li&gt;    &lt;li&gt;FabricCommon.dll &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Then, we have to start the Velocity cluster. In this CTP, all administration commands are written with the console “Administration Tool - Microsoft Distributed Cache”. Then we write the following command line:&lt;/p&gt;  &lt;p&gt;start-cachecluster&lt;/p&gt;  &lt;p&gt;Then, in the config file, we wiil add these lines:&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="line-height:115%;font-family:consolas;color:blue;mso-ansi-language:en;mso-bidi-font-size:9.5pt;" lang="EN"&gt;&amp;lt;&lt;/span&gt;&lt;span style="line-height:115%;font-family:consolas;color:#a31515;mso-ansi-language:en;mso-bidi-font-size:9.5pt;" lang="EN"&gt;configSections&lt;/span&gt;&lt;span style="line-height:115%;font-family:consolas;color:blue;mso-ansi-language:en;mso-bidi-font-size:9.5pt;" lang="EN"&gt;&amp;gt;      &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="line-height:115%;font-family:consolas;color:#a31515;mso-ansi-language:en;mso-bidi-font-size:9.5pt;" lang="EN"&gt;section&lt;/span&gt;&lt;span style="line-height:115%;font-family:consolas;color:blue;mso-ansi-language:en;mso-bidi-font-size:9.5pt;" lang="EN"&gt; &lt;/span&gt;&lt;span style="line-height:115%;font-family:consolas;color:red;mso-ansi-language:en;mso-bidi-font-size:9.5pt;" lang="EN"&gt;name&lt;/span&gt;&lt;span style="line-height:115%;font-family:consolas;color:blue;mso-ansi-language:en;mso-bidi-font-size:9.5pt;" lang="EN"&gt;=&lt;/span&gt;&lt;span style="line-height:115%;font-family:consolas;mso-ansi-language:en;mso-bidi-font-size:9.5pt;" lang="EN"&gt;&amp;quot;&lt;span style="color:blue;"&gt;dataCacheClient&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Microsoft.Data.Caching.DataCacheClientSection, CacheBaseLibrary&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;allowLocation&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;true&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;allowDefinition&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Everywhere&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;/&amp;gt;        &lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configSections&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;        &lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;dataCacheClient&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;deployment&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;routing&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;        &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;localCache&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;isEnabled&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;true&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;sync&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;TTLBased&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;ttlValue&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;60000&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;/&amp;gt;        &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;hosts&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;        &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;host&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;MATTHIEU-PRO&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;cachePort&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;22233&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;cacheHostName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;DistributedCacheService&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;/&amp;gt;        &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;host&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;MATTHIEU-LAPTOP1&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;cachePort&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;22233&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;cacheHostName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;DistributedCacheService&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;/&amp;gt;        &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;host&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;MATTHIEU-LAPTOP2&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;cachePort&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;22233&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;cacheHostName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;DistributedCacheService&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;/&amp;gt;        &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;host&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;MATTHIEU-PC1&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;cachePort&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;22233&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;cacheHostName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;DistributedCacheService&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;/&amp;gt;        &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;host&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;MATTHIEU-PC2&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;cachePort&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;22233&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;cacheHostName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;DistributedCacheService&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;/&amp;gt;        &lt;br /&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;hosts&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;        &lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;dataCacheClient&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Now we can imagine to query the cache in our application (server tier). &lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:consolas;color:blue;mso-bidi-font-size:9.5pt;"&gt;return&lt;/span&gt;&lt;span style="font-family:consolas;mso-bidi-font-size:9.5pt;"&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DataCacheFactory&lt;/span&gt;().GetDefaultCache().GetObjectsInRegion(&lt;span style="color:#a31515;"&gt;&amp;quot;LastImmatPerRegion&amp;quot;&lt;/span&gt;).ToDictionary(keyValuePair =&amp;gt; &lt;span style="color:blue;"&gt;short&lt;/span&gt;.Parse(keyValuePair.Key), keyValuePair =&amp;gt; (&lt;span style="color:blue;"&gt;string&lt;/span&gt;)keyValuePair.Value); &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;With the data in the cache, the query executes in 30 ms!&lt;/p&gt;  &lt;p&gt;Now, we have to fix the last point: initializing the cache and maintaining it.&lt;/p&gt;  &lt;p&gt;To initialize it, it’s very easy. We just have to use the above query:&lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:consolas;color:blue;mso-bidi-font-size:9.5pt;"&gt;var&lt;/span&gt;&lt;span style="font-family:consolas;mso-bidi-font-size:9.5pt;"&gt; cache = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DataCacheFactory&lt;/span&gt;().GetDefaultCache();       &lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;span style="font-family:consolas;"&gt;&lt;span style="color:blue;"&gt;try      &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;{    &lt;br /&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="font-family:consolas;"&gt;cache.RemoveRegion(LAST_IMMAT_PER_REGION);    &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;}    &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="color:blue;"&gt;catch      &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;{    &lt;br /&gt;&lt;/span&gt;&lt;span style="line-height:115%;font-family:consolas;font-size:11pt;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt;}&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;span style="font-family:consolas;mso-bidi-font-size:9.5pt;"&gt;cache.CreateRegion(LAST_IMMAT_PER_REGION, &lt;span style="color:blue;"&gt;false&lt;/span&gt;);     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;color:blue;mso-bidi-font-size:9.5pt;"&gt;foreach&lt;/span&gt;&lt;span style="font-family:consolas;mso-bidi-font-size:9.5pt;"&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; car &lt;span style="color:blue;"&gt;in&lt;/span&gt; &lt;span style="color:blue;"&gt;from&lt;/span&gt; c &lt;span style="color:blue;"&gt;in&lt;/span&gt; context.Cars     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;mso-bidi-font-size:9.5pt;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;group&lt;/span&gt; c &lt;span style="color:blue;"&gt;by&lt;/span&gt; c.Region &lt;span style="color:blue;"&gt;into&lt;/span&gt; g     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;mso-bidi-font-size:9.5pt;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;select&lt;/span&gt; &lt;span style="color:blue;"&gt;new      &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;mso-bidi-font-size:9.5pt;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;mso-bidi-font-size:9.5pt;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;Region = g.Key,     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;mso-bidi-font-size:9.5pt;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;LastId = (&lt;span style="color:blue;"&gt;from&lt;/span&gt; c &lt;span style="color:blue;"&gt;in&lt;/span&gt; g     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;mso-bidi-font-size:9.5pt;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;orderby&lt;/span&gt; c.Letters.Length &lt;span style="color:blue;"&gt;descending&lt;/span&gt;, c.Letters &lt;span style="color:blue;"&gt;descending&lt;/span&gt;, c.Number &lt;span style="color:blue;"&gt;descending      &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;mso-bidi-font-size:9.5pt;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;select&lt;/span&gt; c.Id).FirstOrDefault()     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;mso-bidi-font-size:9.5pt;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;})     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;mso-bidi-font-size:9.5pt;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;cache.Put(car.Region.ToString(), car.LastId, LAST_IMMAT_PER_REGION); &lt;/span&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Now to maintain the cache with the last values, it’s harder. My idea is to use a SQLDependency. The issue is the fact that we can’t, a priori, get the modifications with SQLDependency and, of course, I don’t want to refresh all my cache. So my idea is to add a Trigger on the Cars table which will fill a new table (for updates). &lt;/p&gt;  &lt;p&gt;To begin, we will create this new table: CarsModificationsTmp with six columns: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;TmpId (int Identity(1,1), PK), &lt;/li&gt;    &lt;li&gt;CarId (nvarchar(8), not nullable) &lt;/li&gt;    &lt;li&gt;Number (smallint, not nullable) &lt;/li&gt;    &lt;li&gt;Letters (nvarchar(3), not nullable) &lt;/li&gt;    &lt;li&gt;Region (smallint, not nullable), &lt;/li&gt;    &lt;li&gt;Deleted (bit, not nullable, default=0) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Then, we have to define triggers on Cars table:&lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;CREATE&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt; &lt;span style="color:blue;"&gt;TRIGGER&lt;/span&gt; CarsInserted       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;ON&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt; Cars      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;FOR&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt; &lt;span style="color:blue;"&gt;INSERT        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;AS      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;BEGIN      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;DECLARE&lt;/span&gt; @Id &lt;span style="color:blue;"&gt;AS&lt;/span&gt; &lt;span style="color:blue;"&gt;nvarchar&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;8&lt;span style="color:gray;"&gt;)        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;DECLARE&lt;/span&gt; @Number &lt;span style="color:blue;"&gt;AS&lt;/span&gt; &lt;span style="color:blue;"&gt;smallint        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;DECLARE&lt;/span&gt; @Letters &lt;span style="color:blue;"&gt;AS&lt;/span&gt; &lt;span style="color:blue;"&gt;nvarchar&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;3&lt;span style="color:gray;"&gt;)        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;DECLARE&lt;/span&gt; @Region &lt;span style="color:blue;"&gt;AS&lt;/span&gt; &lt;span style="color:blue;"&gt;smallint        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT&lt;/span&gt; @Id &lt;span style="color:gray;"&gt;=&lt;/span&gt; Id&lt;span style="color:gray;"&gt;,&lt;/span&gt; @Number &lt;span style="color:gray;"&gt;=&lt;/span&gt; Number&lt;span style="color:gray;"&gt;,&lt;/span&gt; @Letters &lt;span style="color:gray;"&gt;=&lt;/span&gt; Letters&lt;span style="color:gray;"&gt;,&lt;/span&gt; @REGION &lt;span style="color:gray;"&gt;=&lt;/span&gt; Region &lt;span style="color:blue;"&gt;FROM&lt;/span&gt; Inserted       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;INSERT&lt;/span&gt; &lt;span style="color:blue;"&gt;INTO&lt;/span&gt; CarsModificationsTmp&lt;span style="color:gray;"&gt;(&lt;/span&gt;CarId&lt;span style="color:gray;"&gt;,&lt;/span&gt; Number&lt;span style="color:gray;"&gt;,&lt;/span&gt; Letters&lt;span style="color:gray;"&gt;,&lt;/span&gt; Region&lt;span style="color:gray;"&gt;)&lt;/span&gt; &lt;span style="color:blue;"&gt;VALUES&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;@Id&lt;span style="color:gray;"&gt;,&lt;/span&gt; @Number&lt;span style="color:gray;"&gt;,&lt;/span&gt; @Letters&lt;span style="color:gray;"&gt;,&lt;/span&gt; @Region&lt;span style="color:gray;"&gt;)        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;END      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;GO      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;CREATE&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt; &lt;span style="color:blue;"&gt;TRIGGER&lt;/span&gt; CarsDeleted       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;ON&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt; Cars      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;FOR&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt; &lt;span style="color:blue;"&gt;DELETE        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;AS      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;BEGIN      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;DECLARE&lt;/span&gt; @Region &lt;span style="color:blue;"&gt;AS&lt;/span&gt; &lt;span style="color:blue;"&gt;smallint        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;DECLARE&lt;/span&gt; @Id &lt;span style="color:blue;"&gt;AS&lt;/span&gt; &lt;span style="color:blue;"&gt;nvarchar&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;8&lt;span style="color:gray;"&gt;)        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;DECLARE&lt;/span&gt; @Number &lt;span style="color:blue;"&gt;AS&lt;/span&gt; &lt;span style="color:blue;"&gt;smallint        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;DECLARE&lt;/span&gt; @Letters &lt;span style="color:blue;"&gt;AS&lt;/span&gt; &lt;span style="color:blue;"&gt;nvarchar&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;3&lt;span style="color:gray;"&gt;)        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT&lt;/span&gt; @Id &lt;span style="color:gray;"&gt;=&lt;/span&gt; Id&lt;span style="color:gray;"&gt;,&lt;/span&gt; @Number &lt;span style="color:gray;"&gt;=&lt;/span&gt; Number&lt;span style="color:gray;"&gt;,&lt;/span&gt; @Letters &lt;span style="color:gray;"&gt;=&lt;/span&gt; Letters&lt;span style="color:gray;"&gt;,&lt;/span&gt; @REGION &lt;span style="color:gray;"&gt;=&lt;/span&gt; Region &lt;span style="color:blue;"&gt;FROM&lt;/span&gt; Deleted       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;INSERT&lt;/span&gt; &lt;span style="color:blue;"&gt;INTO&lt;/span&gt; CarsModificationsTmp&lt;span style="color:gray;"&gt;(&lt;/span&gt;CarId&lt;span style="color:gray;"&gt;,&lt;/span&gt; Number&lt;span style="color:gray;"&gt;,&lt;/span&gt; Letters&lt;span style="color:gray;"&gt;,&lt;/span&gt; Region&lt;span style="color:gray;"&gt;,&lt;/span&gt; Deleted&lt;span style="color:gray;"&gt;)&lt;/span&gt; &lt;span style="color:blue;"&gt;VALUES&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;@Id&lt;span style="color:gray;"&gt;,&lt;/span&gt; @Number&lt;span style="color:gray;"&gt;,&lt;/span&gt; @Letters&lt;span style="color:gray;"&gt;,&lt;/span&gt; @Region&lt;span style="color:gray;"&gt;,&lt;/span&gt; 1&lt;span style="color:gray;"&gt;)        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:10pt;mso-no-proof:yes;"&gt;END&lt;/span&gt;&lt;span style="font-family:consolas;mso-bidi-font-size:9.5pt;"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Last, we will modify our code to use SQL Dependency. &lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:consolas;color:blue;"&gt;private&lt;/span&gt;&lt;span style="font-family:consolas;"&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Load()      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; context = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CarsContainer&lt;/span&gt;())      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;_cache = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DataCacheFactory&lt;/span&gt;().GetDefaultCache();      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;try       &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;_cache.RemoveRegion(LAST_IMMAT_PER_REGION);      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;catch       &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;_cache.CreateRegion(LAST_IMMAT_PER_REGION, &lt;span style="color:blue;"&gt;false&lt;/span&gt;);      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; car &lt;span style="color:blue;"&gt;in&lt;/span&gt; &lt;span style="color:blue;"&gt;from&lt;/span&gt; c &lt;span style="color:blue;"&gt;in&lt;/span&gt; context.Cars      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;group&lt;/span&gt; c &lt;span style="color:blue;"&gt;by&lt;/span&gt; c.Region &lt;span style="color:blue;"&gt;into&lt;/span&gt; g      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;select&lt;/span&gt; &lt;span style="color:blue;"&gt;new       &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;Region = g.Key,      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;LastId = (&lt;span style="color:blue;"&gt;from&lt;/span&gt; c &lt;span style="color:blue;"&gt;in&lt;/span&gt; g      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;orderby&lt;/span&gt; c.Letters.Length &lt;span style="color:blue;"&gt;descending&lt;/span&gt;, c.Letters &lt;span style="color:blue;"&gt;descending&lt;/span&gt;, c.Number &lt;span style="color:blue;"&gt;descending       &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;select&lt;/span&gt; c.Id).FirstOrDefault()      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;})      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;_cache.Put(car.Region.ToString(), car.LastId, LAST_IMMAT_PER_REGION);      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;     &lt;p&gt;&amp;#160; &lt;br /&gt;&lt;/p&gt;   &lt;/span&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;_connectionString = ((&lt;span style="color:#2b91af;"&gt;EntityConnection&lt;/span&gt;)context.Connection).StoreConnection.ConnectionString;        &lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SqlDependency&lt;/span&gt;.Stop(_connectionString);        &lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SqlDependency&lt;/span&gt;.Start(_connectionString);        &lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;DefineCarsNotification();        &lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span&gt;     &lt;p&gt;&amp;#160; &lt;br /&gt;&lt;/p&gt; private&lt;/span&gt;&lt;span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; DefineCarsNotification()      &lt;br /&gt;{      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; connection = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SqlConnection&lt;/span&gt;(_connectionString);      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; command = connection.CreateCommand();      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;command.CommandText = &lt;span style="color:#a31515;"&gt;&amp;quot;SELECT TmpId, Region, CarId, Deleted FROM CarsModificationsTmp&amp;quot;&lt;/span&gt;;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;command.CommandType = &lt;span style="color:#2b91af;"&gt;CommandType&lt;/span&gt;.Text;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; sqlDependency = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SqlDependency&lt;/span&gt;(command);      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;sqlDependency.OnChange += SqlDependency_OnChange;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;connection.Open();      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;command.ExecuteNonQuery();      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;connection.Close();      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span&gt;     &lt;p&gt;&amp;#160; &lt;br /&gt;&lt;/p&gt; private&lt;/span&gt;&lt;span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; SqlDependency_OnChange(&lt;span style="color:blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color:#2b91af;"&gt;SqlNotificationEventArgs&lt;/span&gt; e)      &lt;br /&gt;{      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; contextModifications = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CarsContainer&lt;/span&gt;())      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;bool&lt;/span&gt; any = &lt;span style="color:blue;"&gt;false&lt;/span&gt;;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; cm &lt;span style="color:blue;"&gt;in&lt;/span&gt; contextModifications.CarsModificationsTmps)      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;any = &lt;span style="color:blue;"&gt;true&lt;/span&gt;;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; cacheModifications = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DataCacheFactory&lt;/span&gt;().GetDefaultCache();      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; cacheItem = cacheModifications.GetCacheItem(cm.Region.ToString(), LAST_IMMAT_PER_REGION);      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (cm.Deleted)      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (cacheItem != &lt;span style="color:blue;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; cacheItem.Value.ToString() == cm.CarId)      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; newLastId = (&lt;span style="color:blue;"&gt;from&lt;/span&gt; c &lt;span style="color:blue;"&gt;in&lt;/span&gt; contextModifications.Cars      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;where&lt;/span&gt; c.Region == cm.Region      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;orderby&lt;/span&gt; c.Letters.Length &lt;span style="color:blue;"&gt;descending&lt;/span&gt;, c.Letters &lt;span style="color:blue;"&gt;descending&lt;/span&gt;, c.Number &lt;span style="color:blue;"&gt;descending       &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;select&lt;/span&gt; c.Id).FirstOrDefault();      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (newLastId == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;_cache.Remove(cm.Region.ToString(), LAST_IMMAT_PER_REGION);      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;else       &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;_cache.Put(cm.Region.ToString(), newLastId, LAST_IMMAT_PER_REGION);      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;else       &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; letters;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;int&lt;/span&gt; lettersCompare = &lt;span style="color:brown;"&gt;0&lt;/span&gt;;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (cacheItem == &lt;span style="color:blue;"&gt;null&lt;/span&gt; || (letters = &lt;span style="color:#2b91af;"&gt;Regex&lt;/span&gt;.Match(cacheItem.Value.ToString(), &lt;span style="color:#a31515;"&gt;&amp;quot;[A-Z]{2,3}&amp;quot;&lt;/span&gt;).Value).Length &amp;lt; cm.Letters.Length || (letters.Length == cm.Letters.Length &amp;amp;&amp;amp; ((lettersCompare = &lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;.Compare(letters, cm.Letters)) &amp;lt; &lt;span style="color:brown;"&gt;0&lt;/span&gt; || lettersCompare == &lt;span style="color:brown;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; &lt;span style="color:blue;"&gt;short&lt;/span&gt;.Parse(&lt;span style="color:#2b91af;"&gt;Regex&lt;/span&gt;.Match(cacheItem.Value.ToString(), &lt;span style="color:#a31515;"&gt;&amp;quot;^[0-9]{2,3}&amp;quot;&lt;/span&gt;).Value) &amp;lt; cm.Number)))      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;_cache.Put(cm.Region.ToString(), cm.CarId, LAST_IMMAT_PER_REGION);      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;contextModifications.DeleteObject(cm);      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (any)      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;contextModifications.SaveChanges();      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;DefineCarsNotification();      &lt;p&gt;&lt;/p&gt;   &lt;/span&gt;&lt;/p&gt; &lt;span style="line-height:115%;font-family:consolas;font-size:11pt;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt;}&lt;/span&gt;   &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;We have a possible bug with this. Indeed, SqlDependency_OnChange is asynchronous and so we can have some parallels calls which implies some concurrent issues. Velocity DataCache is thread-safe. But, with the previous code, the concurrency doesn’t allow us to be sure we have the last id in the cache. To fix this, we will use a lock.&lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:consolas;color:blue;"&gt;if&lt;/span&gt;&lt;span style="font-family:consolas;"&gt; (cm.Deleted)     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;lock&lt;/span&gt; (_lockObject)        &lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{        &lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (cacheItem != &lt;span style="color:blue;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; cacheItem.Value.ToString() == cm.CarId)      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; newLastId = (&lt;span style="color:blue;"&gt;from&lt;/span&gt; c &lt;span style="color:blue;"&gt;in&lt;/span&gt; contextModifications.Cars      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;where&lt;/span&gt; c.Region == cm.Region      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;orderby&lt;/span&gt; c.Letters.Length &lt;span style="color:blue;"&gt;descending&lt;/span&gt;, c.Letters &lt;span style="color:blue;"&gt;descending&lt;/span&gt;, c.Number &lt;span style="color:blue;"&gt;descending       &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;select&lt;/span&gt; c.Id).FirstOrDefault();      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (newLastId == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;_cache.Remove(cm.Region.ToString(), LAST_IMMAT_PER_REGION);      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;else       &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;_cache.Put(cm.Region.ToString(), newLastId, LAST_IMMAT_PER_REGION);      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}      &lt;br /&gt;&lt;/span&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}        &lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family:consolas;"&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;color:blue;"&gt;else     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; letters;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;int&lt;/span&gt; lettersCompare = &lt;span style="color:brown;"&gt;0&lt;/span&gt;;      &lt;br /&gt;&lt;/span&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;lock&lt;/span&gt; (_lockObject)        &lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{        &lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (cacheItem == &lt;span style="color:blue;"&gt;null&lt;/span&gt; || (letters = &lt;span style="color:#2b91af;"&gt;Regex&lt;/span&gt;.Match(cacheItem.Value.ToString(), &lt;span style="color:#a31515;"&gt;&amp;quot;[A-Z]{2,3}&amp;quot;&lt;/span&gt;).Value).Length &amp;lt; cm.Letters.Length || (letters.Length == cm.Letters.Length &amp;amp;&amp;amp; ((lettersCompare = &lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;.Compare(letters, cm.Letters)) &amp;lt; &lt;span style="color:brown;"&gt;0&lt;/span&gt; || lettersCompare == &lt;span style="color:brown;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; &lt;span style="color:blue;"&gt;short&lt;/span&gt;.Parse(&lt;span style="color:#2b91af;"&gt;Regex&lt;/span&gt;.Match(cacheItem.Value.ToString(), &lt;span style="color:#a31515;"&gt;&amp;quot;^[0-9]{2,3}&amp;quot;&lt;/span&gt;).Value) &amp;lt; cm.Number)))      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;_cache.Put(cm.Region.ToString(), cm.CarId, LAST_IMMAT_PER_REGION);      &lt;br /&gt;&lt;/span&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}        &lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family:consolas;"&gt;}     &lt;p&gt;&lt;/p&gt;   &lt;/span&gt;&lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;We have another thing like this with the SaveChanges. Indeed, with concurrency, we can try to delete an already deleted DataRow which will throw an OptimisticConcurrencyException. My idea is: if the SaveChanges throws an exception, we will detach all the entities which implies the exception (ie: which are already deleted).&lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:consolas;color:blue;"&gt;if&lt;/span&gt;&lt;span style="font-family:consolas;"&gt; (any)     &lt;br /&gt;&lt;/span&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;for&lt;/span&gt; (; ; )        &lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;try         &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{        &lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;contextModifications.SaveChanges();      &lt;br /&gt;&lt;/span&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;break&lt;/span&gt;;        &lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}        &lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;catch&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;OptimisticConcurrencyException&lt;/span&gt; ex)        &lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{        &lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; ose &lt;span style="color:blue;"&gt;in&lt;/span&gt; ex.StateEntries)&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:consolas;"&gt;       &lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;contextModifications.Detach(ose.Entity);&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:consolas;"&gt;       &lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}        &lt;p&gt;&lt;/p&gt;     &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;Our solution is now thread-safe and is (I hope so &lt;img src="http://msmvps.com/emoticons/emotion-1.gif" alt="Smile" /&gt;) bug free. However, we can improve our code. If we have two update notifications in parallel which aren’t in the same region, it’s a shame to wait that the first ends before treating the second (what we do with our single lock). In fact, my idea is to use a dictionnary of locks instead of a single one. However, the Dictionary class is not thread-safe! We can use another object to lock the Dictionary but with .NET 4, we have a very useful new class: ConcurrentDictionary.&lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="line-height:115%;font-family:consolas;color:blue;font-size:11pt;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt;private&lt;/span&gt;&lt;span style="line-height:115%;font-family:consolas;font-size:11pt;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt; &lt;span style="color:#2b91af;"&gt;ConcurrentDictionary&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;short&lt;/span&gt;, &lt;span style="color:blue;"&gt;object&lt;/span&gt;&amp;gt; _concurrentDictionary = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ConcurrentDictionary&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;short&lt;/span&gt;,&lt;span style="color:blue;"&gt;object&lt;/span&gt;&amp;gt;();&lt;/span&gt; &lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;Now, we will modify our code to use a lock per region:&lt;/p&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:consolas;color:blue;"&gt;object&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:consolas;"&gt; lockRegion = _concurrentDictionary.GetOrAdd(cm.Region, &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:blue;"&gt;object&lt;/span&gt;());        &lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family:consolas;color:blue;"&gt;if&lt;/span&gt;&lt;span style="font-family:consolas;"&gt; (cm.Deleted)     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;lock&lt;/span&gt; (lockRegion)        &lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (cacheItem != &lt;span style="color:blue;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; cacheItem.Value.ToString() == cm.CarId)      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; newLastId = (&lt;span style="color:blue;"&gt;from&lt;/span&gt; c &lt;span style="color:blue;"&gt;in&lt;/span&gt; contextModifications.Cars      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;where&lt;/span&gt; c.Region == cm.Region      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;orderby&lt;/span&gt; c.Letters.Length &lt;span style="color:blue;"&gt;descending&lt;/span&gt;, c.Letters &lt;span style="color:blue;"&gt;descending&lt;/span&gt;, c.Number &lt;span style="color:blue;"&gt;descending       &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;select&lt;/span&gt; c.Id).FirstOrDefault();      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (newLastId == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;_cache.Remove(cm.Region.ToString(), LAST_IMMAT_PER_REGION);      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;else       &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;_cache.Put(cm.Region.ToString(), newLastId, LAST_IMMAT_PER_REGION);      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;}     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;color:blue;"&gt;else     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; letters;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;int&lt;/span&gt; lettersCompare = &lt;span style="color:brown;"&gt;0&lt;/span&gt;;      &lt;br /&gt;&lt;/span&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;lock&lt;/span&gt; (lockRegion)        &lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (cacheItem == &lt;span style="color:blue;"&gt;null&lt;/span&gt; || (letters = &lt;span style="color:#2b91af;"&gt;Regex&lt;/span&gt;.Match(cacheItem.Value.ToString(), &lt;span style="color:#a31515;"&gt;&amp;quot;[A-Z]{2,3}&amp;quot;&lt;/span&gt;).Value).Length &amp;lt; cm.Letters.Length || (letters.Length == cm.Letters.Length &amp;amp;&amp;amp; ((lettersCompare = &lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;.Compare(letters, cm.Letters)) &amp;lt; &lt;span style="color:brown;"&gt;0&lt;/span&gt; || lettersCompare == &lt;span style="color:brown;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; &lt;span style="color:blue;"&gt;short&lt;/span&gt;.Parse(&lt;span style="color:#2b91af;"&gt;Regex&lt;/span&gt;.Match(cacheItem.Value.ToString(), &lt;span style="color:#a31515;"&gt;&amp;quot;^[0-9]{2,3}&amp;quot;&lt;/span&gt;).Value) &amp;lt; cm.Number)))      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;_cache.Put(cm.Region.ToString(), cm.CarId, LAST_IMMAT_PER_REGION);      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}      &lt;p&gt;&lt;/p&gt;   &lt;/span&gt;&lt;/p&gt; &lt;span style="line-height:115%;font-family:consolas;font-size:11pt;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:en-us;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt;}&lt;/span&gt;  &lt;p style="line-height:normal;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;It’s now finish. Enjoy &lt;img src="http://msmvps.com/emoticons/emotion-1.gif" alt="Smile" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1741356" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/matthieu/archive/tags/.Net/default.aspx">.Net</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/Entity+Framework+_2800_EF_2900_/default.aspx">Entity Framework (EF)</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/Entity+Data+Model+_2800_EDM_2900_/default.aspx">Entity Data Model (EDM)</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/SQL/default.aspx">SQL</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/Velocity/default.aspx">Velocity</category></item><item><title>ADO.NET Data Services Client context</title><link>http://msmvps.com/blogs/matthieu/archive/2009/11/04/ado-net-data-services-client.aspx</link><pubDate>Wed, 04 Nov 2009 23:40:24 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1737702</guid><dc:creator>Matthieu MEZIL</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/rsscomments.aspx?PostID=1737702</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/commentapi.aspx?PostID=1737702</wfw:comment><comments>http://msmvps.com/blogs/matthieu/archive/2009/11/04/ado-net-data-services-client.aspx#comments</comments><description>&lt;p&gt;One of the great points with EF is the eco-system around it. Even if it can be used without EF, I think that ADO .NET Data Services is one of the technologies in this eco-system. Indeed, using ADO.NET Data Services with EF implies almost no code to write some LINQ queries in the client tier or to save the changes. &lt;/p&gt;  &lt;p&gt;However, when we use the generated proxy in the client tier there are some bad points:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;For example with Northwind, if we add an orderDetail to the order.OrderDetails collection, the orderDetail.Order is still null. In reverse, if we set the orderDetail.Order, the orderDetail isn’t added to the order.OrderDetails collection. &lt;/li&gt;    &lt;li&gt;Moreover, if we load the orders and then the orderDetails, the OrderDetails collection of the orders is empty and the orderDetails order is null. However, because OrderID is a part of the orderDetails key, we should be able to get automatically the relation as EF do.      &lt;br /&gt;//To have this relation with ADO.NET Data Services, we have to use the Expand method in the query or to use the LoadProperty method.       &lt;br /&gt;With EF4, we can have FK in the model (with EF v1, we have only the FKs which are included in the PK) which is really great because, in theory, it’s now possible to reform the relations. &lt;/li&gt;    &lt;li&gt;Another point: if you want to add an order with some (new) orderDetails, you need to call the Add for the order, then the Add for all orderDetails (the MS client context ignore the navigation properties) and then you also need to call the methods SetLink and AddLink (because the order key is an Identity). So in fact this is the code you have to write: &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-ansi-language:en-us;" lang="EN-US"&gt;context.AddToOrders(o); &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;color:blue;font-size:9.5pt;mso-ansi-language:en-us;" lang="EN-US"&gt;foreach&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-ansi-language:en-us;" lang="EN-US"&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; od &lt;span style="color:blue;"&gt;in&lt;/span&gt; o.OrderDetails) &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-ansi-language:en-us;" lang="EN-US"&gt;{ &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;context.AddToOrderDetails(od); &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;context.AddLink(o, &lt;span style="color:#a31515;"&gt;&amp;quot;OrderDetails&amp;quot;&lt;/span&gt;, od); &lt;/span&gt;    &lt;br /&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;context.SetLink(od, &lt;span style="color:#a31515;"&gt;&amp;quot;Order&amp;quot;&lt;/span&gt;, o); &lt;/span&gt;    &lt;br /&gt;&lt;span style="line-height:115%;font-family:consolas;font-size:9.5pt;mso-ansi-language:fr;mso-fareast-font-family:calibri;mso-fareast-theme-font:minor-latin;mso-fareast-language:en-us;mso-bidi-language:ar-sa;"&gt;}&lt;/span&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;One more point, the context doesn’t track changes alone. You have to call yourself the UpdateObject method.&lt;/li&gt;    &lt;li&gt;Finally, if we add an orderDetail to the context and only then the associated order, when we call the SaveChanges, we have an exception because the context doesn’t change the Add order &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;So my idea was to code another client tier context. But of course, I wanted a generic solution. It means that I wanted to code something usable with every model. To realize it, I used a T4 template based on the edmx (in the server tier). This implies two things:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;We need to use EF in the server tier &lt;/li&gt;    &lt;li&gt;We need to have the server tier edmx when we code the client tier &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;My template fixes all the above issues.&lt;/p&gt;  &lt;p&gt;You can download it &lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.Demo/2068.ADONETDataServicesClientTemplate.zip" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;You also can download all the solution (with unit tests) &lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.Demo/3630.TestADONETDataServicesClientContext.zip" target="_blank"&gt;here&lt;/a&gt; and the DB creation script &lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.Demo/2061.MyNorthwindEF-script.zip" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;//I admit that some parts of the code aren’t great but ADO.NET Data Services is an extremely “closed” technology so it isn’t so easy and I would probably have some better ideas if I didn’t write it so late in the night &lt;img src="http://msmvps.com/emoticons/emotion-5.gif" alt="Wink" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1737702" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/matthieu/archive/tags/.Net/default.aspx">.Net</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/Entity+Framework+_2800_EF_2900_/default.aspx">Entity Framework (EF)</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/Entity+Data+Model+_2800_EDM_2900_/default.aspx">Entity Data Model (EDM)</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/ADO.NET+Data+Services/default.aspx">ADO.NET Data Services</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/T4/default.aspx">T4</category></item><item><title>Generate a WCF service from an edmx with T4 v2</title><link>http://msmvps.com/blogs/matthieu/archive/2009/10/26/generate-a-wcf-service-from-an-edmx-with-t4-v2.aspx</link><pubDate>Mon, 26 Oct 2009 23:13:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1735482</guid><dc:creator>Matthieu MEZIL</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/rsscomments.aspx?PostID=1735482</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/commentapi.aspx?PostID=1735482</wfw:comment><comments>http://msmvps.com/blogs/matthieu/archive/2009/10/26/generate-a-wcf-service-from-an-edmx-with-t4-v2.aspx#comments</comments><description>&lt;p&gt;&lt;a target="_blank" href="http://msmvps.com/blogs/matthieu/archive/2009/10/20/entity-framework-the-productivity-way.aspx"&gt;I recently published a T4 template to generate a WCF service&lt;/a&gt;. &lt;a target="_blank" href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.Demo/5226.WCFService-v2.zip"&gt;I updated it to be able to load its relationships from an entity&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;When the template is written (what I&amp;rsquo;ve already done), it generates the WCF service for us (you just have to set the end point in the config file). &lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://msmvps.com/blogs/matthieu/archive/2009/10/20/entity-framework-the-productivity-way.aspx"&gt;As I explained in my previous post&lt;/a&gt;, the great point with it is the fact that the code writing time is not dependant of the number of entities on the model. Moreover,&amp;nbsp; the template is generally (it&amp;rsquo;s the case here) not dependant of the model so we can use it with another model and more generally with another project.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1735482" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/matthieu/archive/tags/.Net/default.aspx">.Net</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/Entity+Framework+_2800_EF_2900_/default.aspx">Entity Framework (EF)</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/Entity+Data+Model+_2800_EDM_2900_/default.aspx">Entity Data Model (EDM)</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/T4/default.aspx">T4</category></item><item><title>Entity Framework: the productivity way</title><link>http://msmvps.com/blogs/matthieu/archive/2009/10/20/entity-framework-the-productivity-way.aspx</link><pubDate>Tue, 20 Oct 2009 13:39:12 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1733662</guid><dc:creator>Matthieu MEZIL</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/rsscomments.aspx?PostID=1733662</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/commentapi.aspx?PostID=1733662</wfw:comment><comments>http://msmvps.com/blogs/matthieu/archive/2009/10/20/entity-framework-the-productivity-way.aspx#comments</comments><description>&lt;p&gt;One of the best points with Entity Framework is the developer productivity gain. If you associate EF with the T4 template code generation, this gain explodes. Imagine that we want a WCF service which exposes some data. For each entity type, you probably want a Get method which returns the entities, perhaps another Get which takes the entity id as parameter and which returns the entity with its relationships, a Add, a Update, perhaps a Delete. &lt;/p&gt;  &lt;p&gt;EF allows an important productivity gain for the entities development and their use. However, in our case, to code to write is almost the same for each entity type. It means that it’s time to use the T4 template.&lt;/p&gt;  &lt;p&gt;In all T4 samples I studied, this great template is used only for the entity generation. We will try here to go ahead.&lt;/p&gt;  &lt;p&gt;WIth the T4 template, you will write your meta-code which will generate the WCF service! And what is very cool is the fact that you will be able to use your template in another project. I try to compare here the productivity between a code using ADO .NET 2.0 and a code using the Entity Framework. My first observation is: I forgot that it’s so boring and so long to use the classic ADO. &lt;/p&gt;  &lt;p&gt;With EF and T4, the only thing I don’t generate is the relation list to load per entity type (I could use a fixed depth with T4 but I preferred to have a business logic for the relationships loading). With ADO .NET 2.0, I have to write all the code!&lt;/p&gt;  &lt;p&gt;Moreover, “classic” ADO implies a string query and we can imagine to have some writing mistakes in our SQL queries and so it implies to write some unit tests which take time.&lt;/p&gt;  &lt;p&gt;One of the first point we can see is the code reading. It’s so much easier with EF! &lt;/p&gt;  &lt;p&gt;For the GetOrder(orderId) method, my ADO 2.0 code is the following: &lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;const&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; SELECT_ORDERS = &lt;span style="color:#a31515;"&gt;&amp;quot;OrderID, CustomerID, EmployeeID, OrderDate, RequiredDate, ShippedDate, ShipVia, Freight, ShipName, ShipAddress, ShipCity, ShipRegion, ShipPostalCode, ShipCountry FROM ORDERS&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;const&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; SELECT_ORDERDETAILS = &lt;span style="color:#a31515;"&gt;&amp;quot;OrderID, ProductID, UnitPrice, Quantity, Discount FROM [Order Details]&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;const&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; SELECT_CUSTOMERS = &lt;span style="color:#a31515;"&gt;&amp;quot;C.CustomerID, CompanyName, ContactName, ContactTitle, [Address], City, Region, PostalCode, Country, Phone, Fax, Since, Points, CardNumber, CAST((CASE M.CustomerID when NULL then 0 else 1 END) AS bit) AS IsMember FROM Customers AS C LEFT OUTER JOIN Members AS M ON C.CustomerID = M.CustomerID&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Order&lt;/span&gt; GetOrder(&lt;span style="color:blue;"&gt;int&lt;/span&gt; orderID)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; ReadEntity&amp;lt;&lt;span style="color:#2b91af;"&gt;Order&lt;/span&gt;&amp;gt;(&lt;span style="color:blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;&amp;quot;SELECT TOP 1 {0} WHERE OrderID = @OrderID; \n SELECT {1} WHERE OrderID = @OrderID;&amp;quot;&lt;/span&gt;, SELECT_ORDERS, SELECT_ORDERDETAILS), &lt;span style="color:blue;"&gt;new&lt;/span&gt;[] { &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SqlParameter&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;OrderID&amp;quot;&lt;/span&gt;, orderID) }, reader =&amp;gt; GetOrder(reader), (o, reader, connection) =&amp;gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; o.OrderDetails = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;OrderDetail&lt;/span&gt;&amp;gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; reader.NextResult();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;while&lt;/span&gt; (reader.Read())&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; orderDetail = GetOrderDetail(reader);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; orderDetail.Order = o;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; o.OrderDetails.Add(orderDetail);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (o.CustomerID != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; o.Customer = ReadEntity&amp;lt;&lt;span style="color:#2b91af;"&gt;Customer&lt;/span&gt;&amp;gt;(&lt;span style="color:blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;&amp;quot;SELECT TOP 1 {0} WHERE C.CustomerID = @CustomerID&amp;quot;&lt;/span&gt;, SELECT_CUSTOMERS), &lt;span style="color:blue;"&gt;new&lt;/span&gt;[] { &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SqlParameter&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;CustomerID&amp;quot;&lt;/span&gt;, o.CustomerID) }, subReader =&amp;gt; GetCustomer(subReader), connection);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; pq = o.OrderDetails.Select(od =&amp;gt; od.ProductID.ToString());&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (pq.Any())&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; products = ReadEntities&amp;lt;&lt;span style="color:#2b91af;"&gt;Product&lt;/span&gt;&amp;gt;(&lt;span style="color:blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;&amp;quot;SELECT {0} WHERE ProductID IN ({1})&amp;quot;&lt;/span&gt;, SELECT_PRODUCTS, pq.Skip(1).Any() ? pq.Aggregate((p1, p2) =&amp;gt; p1.Contains(&lt;span style="color:blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;&amp;quot; {0} &amp;quot;&lt;/span&gt;, p2)) ? p1 : &lt;span style="color:blue;"&gt;string&lt;/span&gt;.Concat(&lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot;&lt;/span&gt;, p1, &lt;span style="color:#a31515;"&gt;&amp;quot; , &amp;quot;&lt;/span&gt;, p2)) : pq.First()), subReader =&amp;gt; GetProduct(subReader), connection);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; p &lt;span style="color:blue;"&gt;in&lt;/span&gt; products)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; p.OrderDetails = o.OrderDetails.Where(od =&amp;gt; od.ProductID == p.ProductID).Select(od =&amp;gt; { od.Product = p; &lt;span style="color:blue;"&gt;return&lt;/span&gt; od; }).ToList();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; });&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; T ReadEntity&amp;lt;T&amp;gt;(&lt;span style="color:blue;"&gt;string&lt;/span&gt; commandText, &lt;span style="color:#2b91af;"&gt;SqlParameter&lt;/span&gt;[] parameters, &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;SqlDataReader&lt;/span&gt;, T&amp;gt; getEntityFromReader, &lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt;&amp;lt;T, &lt;span style="color:#2b91af;"&gt;SqlDataReader&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;SqlConnection&lt;/span&gt;&amp;gt; moreAction = &lt;span style="color:blue;"&gt;null&lt;/span&gt;) &lt;span style="color:blue;"&gt;where&lt;/span&gt; T : &lt;span style="color:blue;"&gt;class&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;SqlConnection&lt;/span&gt; connection = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SqlConnection&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;ConfigurationManager&lt;/span&gt;.ConnectionStrings[&lt;span style="color:#a31515;"&gt;&amp;quot;NorthwindEntities&amp;quot;&lt;/span&gt;].ToString());&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; connection.Open();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;try&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; ReadEntity(commandText, parameters, getEntityFromReader, connection, moreAction);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;finally&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; connection.Close();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; T ReadEntity&amp;lt;T&amp;gt;(&lt;span style="color:blue;"&gt;string&lt;/span&gt; commandText, &lt;span style="color:#2b91af;"&gt;SqlParameter&lt;/span&gt;[] parameters, &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;SqlDataReader&lt;/span&gt;, T&amp;gt; getEntityFromReader, &lt;span style="color:#2b91af;"&gt;SqlConnection&lt;/span&gt; connection, &lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt;&amp;lt;T, &lt;span style="color:#2b91af;"&gt;SqlDataReader&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;SqlConnection&lt;/span&gt;&amp;gt; moreAction = &lt;span style="color:blue;"&gt;null&lt;/span&gt;) &lt;span style="color:blue;"&gt;where&lt;/span&gt; T : &lt;span style="color:blue;"&gt;class&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;SqlCommand&lt;/span&gt; command = connection.CreateCommand();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; command.CommandText = commandText;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; command.Parameters.AddRange(parameters);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;SqlDataReader&lt;/span&gt; reader = command.ExecuteReader();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;try&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (reader.Read())&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; value = getEntityFromReader(reader);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (moreAction != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; moreAction(value, reader, connection);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; value;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;null&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;finally&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; reader.Close();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;T&amp;gt; ReadEntities&amp;lt;T&amp;gt;(&lt;span style="color:blue;"&gt;string&lt;/span&gt; commandText, &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;SqlDataReader&lt;/span&gt;, T&amp;gt; getEntityFromReader, &lt;span style="color:#2b91af;"&gt;SqlConnection&lt;/span&gt; connection) &lt;span style="color:blue;"&gt;where&lt;/span&gt; T : &lt;span style="color:blue;"&gt;class&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; value = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;T&amp;gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;SqlCommand&lt;/span&gt; command = connection.CreateCommand();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; command.CommandText = commandText;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;SqlDataReader&lt;/span&gt; reader = command.ExecuteReader();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;try&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;while&lt;/span&gt; (reader.Read())&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; value.Add(getEntityFromReader(reader));&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; value;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;finally&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; reader.Close();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Order&lt;/span&gt; GetOrder(&lt;span style="color:#2b91af;"&gt;SqlDataReader&lt;/span&gt; reader)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Order&lt;/span&gt; { OrderID = reader.GetInt32(0), CustomerID = reader.IsDBNull(1) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : reader.GetString(1), EmployeeID = reader.IsDBNull(2) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : (&lt;span style="color:blue;"&gt;int&lt;/span&gt;?)reader.GetInt32(2), OrderDate = reader.IsDBNull(3) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : (&lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt;?)reader.GetDateTime(3), RequiredDate = reader.IsDBNull(4) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : (&lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt;?)reader.GetDateTime(4), ShippedDate = reader.IsDBNull(5) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : (&lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt;?)reader.GetDateTime(5), ShipVia = reader.IsDBNull(6) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : (&lt;span style="color:blue;"&gt;int&lt;/span&gt;?)reader.GetInt32(6), Freight = reader.IsDBNull(7) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : (&lt;span style="color:blue;"&gt;decimal&lt;/span&gt;?)reader.GetDecimal(7), ShipName = reader.IsDBNull(8) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : reader.GetString(8), ShipAddress = reader.IsDBNull(9) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : reader.GetString(9), ShipCity = reader.IsDBNull(10) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : reader.GetString(10), ShipRegion = reader.IsDBNull(11) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : reader.GetString(11), ShipPostalCode = reader.IsDBNull(12) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : reader.GetString(12), ShipCountry = reader.IsDBNull(13) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : reader.GetString(13) };&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;OrderDetail&lt;/span&gt; GetOrderDetail(&lt;span style="color:#2b91af;"&gt;SqlDataReader&lt;/span&gt; reader)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;OrderDetail&lt;/span&gt; { OrderID = reader.GetInt32(0), ProductID = reader.GetInt32(1), UnitPrice = reader.GetDecimal(2), Quantity = reader.GetInt16(3), Discount = reader.GetFloat(4) };&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Customer&lt;/span&gt; GetCustomer(&lt;span style="color:#2b91af;"&gt;SqlDataReader&lt;/span&gt; reader)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (reader.GetBoolean(14))&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; GetMember(reader);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; GetCustomer&amp;lt;&lt;span style="color:#2b91af;"&gt;Customer&lt;/span&gt;&amp;gt;(reader);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; T GetCustomer&amp;lt;T&amp;gt;(&lt;span style="color:#2b91af;"&gt;SqlDataReader&lt;/span&gt; reader) &lt;span style="color:blue;"&gt;where&lt;/span&gt; T : &lt;span style="color:#2b91af;"&gt;Customer&lt;/span&gt;, &lt;span style="color:blue;"&gt;new&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; T { CustomerID = reader.GetString(0), CompanyName = reader.GetString(1), ContactName = reader.IsDBNull(2) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : reader.GetString(2), ContactTitle = reader.IsDBNull(3) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : reader.GetString(3), Address = reader.IsDBNull(4) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : reader.GetString(4), City = reader.IsDBNull(5) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : reader.GetString(5), Region = reader.IsDBNull(6) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : reader.GetString(6), PostalCode = reader.IsDBNull(7) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : reader.GetString(7), Country = reader.IsDBNull(8) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : reader.GetString(8), Phone = reader.IsDBNull(9) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : reader.GetString(9), Fax = reader.IsDBNull(10) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : reader.GetString(10) };&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Member&lt;/span&gt; GetMember(&lt;span style="color:#2b91af;"&gt;SqlDataReader&lt;/span&gt; reader)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; member = GetCustomer&amp;lt;&lt;span style="color:#2b91af;"&gt;Member&lt;/span&gt;&amp;gt;(reader);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; member.Since = reader.IsDBNull(11) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : (&lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt;?)reader.GetDateTime(11);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; member.Points = reader.IsDBNull(12) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : (&lt;span style="color:blue;"&gt;int&lt;/span&gt;?)reader.GetInt32(12);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; member.CardNumber = reader.IsDBNull(13) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : reader.GetString(13);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; member;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Product&lt;/span&gt; GetProduct(&lt;span style="color:#2b91af;"&gt;SqlDataReader&lt;/span&gt; dataReader)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Product&lt;/span&gt; { ProductID = dataReader.GetInt32(0), ProductName = dataReader.GetString(1), SupplierID = dataReader.IsDBNull(2) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : (&lt;span style="color:blue;"&gt;int&lt;/span&gt;?)dataReader.GetInt32(2), CategoryID = dataReader.IsDBNull(3) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : (&lt;span style="color:blue;"&gt;int&lt;/span&gt;?)dataReader.GetInt32(3), QuantityPerUnit = dataReader.IsDBNull(4) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : dataReader.GetString(4), UnitPrice = dataReader.IsDBNull(5) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : (&lt;span style="color:blue;"&gt;decimal&lt;/span&gt;?)dataReader.GetDecimal(5), UnitsInStock = dataReader.IsDBNull(6) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : (&lt;span style="color:blue;"&gt;short&lt;/span&gt;?)dataReader.GetInt16(6), UnitsOnOrder = dataReader.IsDBNull(7) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : (&lt;span style="color:blue;"&gt;short&lt;/span&gt;?)dataReader.GetInt16(7), ReorderLevel = dataReader.IsDBNull(8) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : (&lt;span style="color:blue;"&gt;short&lt;/span&gt;?)dataReader.GetInt16(8), Discontinued = dataReader.GetBoolean(9) };&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Crazy!&lt;/p&gt;  &lt;p&gt;With EF, this is simply the following:&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//Generated file&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;partial&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;NorthwindService&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;NorthwindEntities&lt;/span&gt;, System.&lt;span style="color:#2b91af;"&gt;Int32&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;Order&lt;/span&gt;&amp;gt; GetOrderCQ = &lt;span style="color:#2b91af;"&gt;CompiledQuery&lt;/span&gt;.Compile&amp;lt;&lt;span style="color:#2b91af;"&gt;NorthwindEntities&lt;/span&gt;, System.&lt;span style="color:#2b91af;"&gt;Int32&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;Order&lt;/span&gt;&amp;gt;((context, OrderID) =&amp;gt; context.Orders.OfType&amp;lt;&lt;span style="color:#2b91af;"&gt;Order&lt;/span&gt;&amp;gt;().FirstOrDefault(e =&amp;gt; e.OrderID == OrderID));&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;NorthwindEntities&lt;/span&gt;, System.&lt;span style="color:#2b91af;"&gt;Int32&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;Order&lt;/span&gt;&amp;gt; GetOrderWithIncludeCQ { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Order&lt;/span&gt; GetOrder(System.&lt;span style="color:#2b91af;"&gt;Int32&lt;/span&gt; OrderID)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;using&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; context = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;NorthwindEntities&lt;/span&gt;())&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (GetOrderWithIncludeCQ != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; GetOrderWithIncludeCQ(context, OrderID);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; GetOrderCQ(context, OrderID);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//My partial part&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;partial&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;NorthwindService&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;static&lt;/span&gt; NorthwindService()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;     &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; GetOrderWithIncludeCQ = (context, orderID) =&amp;gt; context.Orders.Include(&lt;span style="color:#a31515;"&gt;&amp;quot;OrderDetails.Product&amp;quot;&lt;/span&gt;).Include(&lt;span style="color:#a31515;"&gt;&amp;quot;Customer&amp;quot;&lt;/span&gt;).FirstOrDefault(o =&amp;gt; o.OrderID == orderID);&lt;/p&gt;   &lt;/div&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Moreover, as explained previously, with EF I write only one line of code:&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;GetOrderWithIncludeCQ = (context, orderID) =&amp;gt; context.Orders.Include(&lt;span style="color:#a31515;"&gt;&amp;quot;OrderDetails.Product&amp;quot;&lt;/span&gt;).Include(&lt;span style="color:#a31515;"&gt;&amp;quot;Customer&amp;quot;&lt;/span&gt;).FirstOrDefault(o =&amp;gt; o.OrderID == orderID);&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;What a productivity gain!&lt;/p&gt;  &lt;p&gt;This is the dev time function of the number of entities:&lt;/p&gt;  &lt;table border="2" cellspacing="0" cellpadding="2" width="944"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td width="146"&gt;Nb entités / temps de dev&lt;/td&gt;        &lt;td width="39"&gt;         &lt;p align="right"&gt;1&lt;/p&gt;       &lt;/td&gt;        &lt;td width="39"&gt;         &lt;p align="right"&gt;2&lt;/p&gt;       &lt;/td&gt;        &lt;td width="39"&gt;         &lt;p align="right"&gt;3&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;4&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;5&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;6&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;7&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;8&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;9&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;10&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;11&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;12&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;13&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;14&lt;/p&gt;       &lt;/td&gt;        &lt;td width="57"&gt;         &lt;p align="right"&gt;100&lt;/p&gt;       &lt;/td&gt;        &lt;td width="66"&gt;         &lt;p align="right"&gt;500&lt;/p&gt;       &lt;/td&gt;        &lt;td width="66"&gt;         &lt;p align="right"&gt;1000&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width="146"&gt;&lt;strong&gt;EF&lt;/strong&gt;&lt;/td&gt;        &lt;td width="39"&gt;         &lt;p align="right"&gt;3&lt;/p&gt;       &lt;/td&gt;        &lt;td width="39"&gt;         &lt;p align="right"&gt;3&lt;/p&gt;       &lt;/td&gt;        &lt;td width="39"&gt;         &lt;p align="right"&gt;4&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;4&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;4&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;4&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;5&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;5&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;5&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;5&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;6&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;6&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;6&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;6&lt;/p&gt;       &lt;/td&gt;        &lt;td width="57"&gt;         &lt;p align="right"&gt;28&lt;/p&gt;       &lt;/td&gt;        &lt;td width="66"&gt;         &lt;p align="right"&gt;128&lt;/p&gt;       &lt;/td&gt;        &lt;td width="66"&gt;         &lt;p align="right"&gt;253&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width="146"&gt;&lt;strong&gt;ADO .NET 2.0&lt;/strong&gt;&lt;/td&gt;        &lt;td width="40"&gt;         &lt;p align="right"&gt;35&lt;/p&gt;       &lt;/td&gt;        &lt;td width="40"&gt;         &lt;p align="right"&gt;65&lt;/p&gt;       &lt;/td&gt;        &lt;td width="39"&gt;         &lt;p align="right"&gt;95&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;125&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;155&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;185&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;215&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;245&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;275&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;305&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;335&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;365&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;395&lt;/p&gt;       &lt;/td&gt;        &lt;td width="48"&gt;         &lt;p align="right"&gt;425&lt;/p&gt;       &lt;/td&gt;        &lt;td width="57"&gt;         &lt;p align="right"&gt;3005&lt;/p&gt;       &lt;/td&gt;        &lt;td width="66"&gt;         &lt;p align="right"&gt;15005&lt;/p&gt;       &lt;/td&gt;        &lt;td width="66"&gt;         &lt;p align="right"&gt;30005&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;So for 1000 entities, with ADO 2.0, it takes more than 66 days (7.5 h per day) against only 4 hours for Entity Framework. Ok I’m not honnest. If we have 1000 entities, it’s better to split our model into some models. SO we will say 2 days for EF against 2.5 months for ADO 2.0. Great isn’t it?&lt;/p&gt;  &lt;p&gt;Moreover, the EF code is easier to read, there is not a lot of reason to keep on using ADO .NET 2.0. &lt;/p&gt;  &lt;p&gt;I just want to tell one last point: it’s very important to have a training on EF (for this you can contact me (matthieu.mezil at live.fr)). This is very important because even if EF seems very easy to use, there are important concepts you have to know:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;not to lose a lot of time &lt;/li&gt;    &lt;li&gt;to get the result you wished (particularly with the non persisted entities) &lt;/li&gt;    &lt;li&gt;not to have bad performance &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;You can download the tt I wrote &lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.Demo/5342.NorthwindService.zip" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1733662" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/matthieu/archive/tags/.Net/default.aspx">.Net</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/Entity+Framework+_2800_EF_2900_/default.aspx">Entity Framework (EF)</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/Entity+Data+Model+_2800_EDM_2900_/default.aspx">Entity Data Model (EDM)</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/WCF/default.aspx">WCF</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/T4/default.aspx">T4</category></item><item><title>EF: Include with where clause</title><link>http://msmvps.com/blogs/matthieu/archive/2009/10/07/ef-include-with-where-clause.aspx</link><pubDate>Wed, 07 Oct 2009 05:10:06 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1730426</guid><dc:creator>Matthieu MEZIL</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/rsscomments.aspx?PostID=1730426</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/commentapi.aspx?PostID=1730426</wfw:comment><comments>http://msmvps.com/blogs/matthieu/archive/2009/10/07/ef-include-with-where-clause.aspx#comments</comments><description>&lt;p&gt;Several guys ask me if it’s possible to add a condition in the Include method and the answer is no. &lt;/p&gt;  &lt;p&gt;However you can do an equivalent like this:&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;from&lt;/span&gt; cWithP &lt;span style="color:blue;"&gt;in&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; (&lt;span style="color:blue;"&gt;from&lt;/span&gt; c &lt;span style="color:blue;"&gt;in&lt;/span&gt; context.Categories&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;select&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Category = c,&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Products = &lt;span style="color:blue;"&gt;from&lt;/span&gt; p &lt;span style="color:blue;"&gt;in&lt;/span&gt; c.Products&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;where&lt;/span&gt; p.UnitPrice &amp;gt; 20&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;select&lt;/span&gt; p&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }).AsEnumerable()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;select&lt;/span&gt; cWithP.Category;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;or the condensed equivalent:&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;context.Categories.Select(c =&amp;gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; { Category = c, Products = c.Products.Where(p =&amp;gt; p.UnitPrice &amp;gt; 20) }).AsEnumerable().Select(cp =&amp;gt; cp.Category);&lt;/p&gt; &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1730426" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/matthieu/archive/tags/.Net/default.aspx">.Net</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/Entity+Framework+_2800_EF_2900_/default.aspx">Entity Framework (EF)</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/Entity+Data+Model+_2800_EDM_2900_/default.aspx">Entity Data Model (EDM)</category></item><item><title>I need you!</title><link>http://msmvps.com/blogs/matthieu/archive/2009/09/26/i-need-you.aspx</link><pubDate>Sat, 26 Sep 2009 18:17:24 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1727364</guid><dc:creator>Matthieu MEZIL</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/rsscomments.aspx?PostID=1727364</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/commentapi.aspx?PostID=1727364</wfw:comment><comments>http://msmvps.com/blogs/matthieu/archive/2009/09/26/i-need-you.aspx#comments</comments><description>&lt;p&gt;I submitted one Birds of Feather session for the next Tech Ed in Berlin. &lt;/p&gt;  &lt;p&gt;My session submission depends on &lt;a href="http://www.msteched.com/europe/bof/voting.aspx" target="_blank"&gt;your votes&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I think that you will find by yourselves which is my session &lt;img src="http://msmvps.com/emoticons/emotion-5.gif" alt="Wink" /&gt;&lt;/p&gt;  &lt;p&gt;Thanks by advance for your votes&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1727364" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/matthieu/archive/tags/.Net/default.aspx">.Net</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/Entity+Framework+_2800_EF_2900_/default.aspx">Entity Framework (EF)</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/Entity+Data+Model+_2800_EDM_2900_/default.aspx">Entity Data Model (EDM)</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/Tech+Ed/default.aspx">Tech Ed</category></item><item><title>ADO.NET EntityObject Generator: how to get the EntityType’s EntitySet and how to get EntitySet’s EntityTypes?</title><link>http://msmvps.com/blogs/matthieu/archive/2009/09/02/ado-net-entityobject-generator-how-to-get-the-entitytype-s-entityset-and-how-to-get-entityset-s-entitytypes.aspx</link><pubDate>Wed, 02 Sep 2009 20:49:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1720351</guid><dc:creator>Matthieu MEZIL</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/rsscomments.aspx?PostID=1720351</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/commentapi.aspx?PostID=1720351</wfw:comment><comments>http://msmvps.com/blogs/matthieu/archive/2009/09/02/ado-net-entityobject-generator-how-to-get-the-entitytype-s-entityset-and-how-to-get-entityset-s-entitytypes.aspx#comments</comments><description>&lt;p&gt;One of my customers wanted to know how to get all EntityTypes for an EntitySet in his T4 template based on the MS ADO.NET EntityObject Generator one.&lt;/p&gt;
&lt;p&gt;So I made &lt;a target="_blank" href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.Demo/6470.Model1.zip"&gt;a POC&lt;/a&gt; for him. &lt;/p&gt;
&lt;p&gt;What do I do?&lt;/p&gt;
&lt;p&gt;I change two classes included in the template (my changes are in bold):&lt;/p&gt;
&lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EntitySetObjectSetPropertyWrapper&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;MetadataItemWrapper&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;{&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; EntitySetObjectSetPropertyWrapper(&lt;span style="color:#2b91af;"&gt;EntitySet&lt;/span&gt; entitySet, &lt;span style="color:#2b91af;"&gt;WrapperBase&lt;/span&gt; wrapper)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : &lt;span style="color:blue;"&gt;base&lt;/span&gt;(entitySet, wrapper)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;&lt;strong&gt;public&lt;/strong&gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EntitySet&lt;/span&gt; Source { &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;EntitySet&lt;/span&gt;)&lt;span style="color:blue;"&gt;base&lt;/span&gt;.Source; } }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; ModelName { &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; Source.Name; } }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; PropertyName { &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; Escape(Source.Name); } }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; FieldName { &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#a31515;"&gt;&amp;quot;_&amp;quot;&lt;/span&gt; + Source.Name; } }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; TypeName { &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; GetStructuralTypeName(Source.ElementType); } }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; GetterAccessibility { &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; GetAccessibility(Source, GETTER_ACCESS); } }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; NewModifier { &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; HasBaseMemberWithMatchingName(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(ObjectContext), Source.Name) ? &lt;span style="color:#a31515;"&gt;&amp;quot;new &amp;quot;&lt;/span&gt; : &lt;span style="color:#a31515;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;; } }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;EntityType&lt;/span&gt;&amp;gt; GetAllEntityTypes(&lt;span style="color:#2b91af;"&gt;ItemCollectionWrapper&lt;/span&gt; edm)&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;var&lt;/span&gt; entityType = Source.ElementType;&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;yield&lt;/span&gt; &lt;span style="color:blue;"&gt;return&lt;/span&gt; entityType;&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;var&lt;/span&gt; entityTypeWrapper = edm.SourceEntities.First(e =&amp;gt; e.Source == entityType);&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; subEntityType &lt;span style="color:blue;"&gt;in&lt;/span&gt; entityTypeWrapper.SubEntityTypes(edm))&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;yield&lt;/span&gt; &lt;span style="color:blue;"&gt;return&lt;/span&gt; subEntityType;&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;}&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EntityTypeWrapper&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;StructuralTypeWrapper&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;{&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; EntityTypeWrapper(&lt;span style="color:#2b91af;"&gt;EntityType&lt;/span&gt; entity, &lt;span style="color:#2b91af;"&gt;WrapperBase&lt;/span&gt; wrapper)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : &lt;span style="color:blue;"&gt;base&lt;/span&gt;(entity, wrapper)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EntityType&lt;/span&gt; Source { &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;EntityType&lt;/span&gt;)&lt;span style="color:blue;"&gt;base&lt;/span&gt;.Source; } }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; AbstractOption { &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; Source.Abstract ? &lt;span style="color:#a31515;"&gt;&amp;quot;abstract &amp;quot;&lt;/span&gt; : &lt;span style="color:#a31515;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;; } }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; IsAbstract { &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; Source.Abstract; } }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; BaseTypeName { &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; Source.BaseType == &lt;span style="color:blue;"&gt;null&lt;/span&gt; ? &lt;span style="color:#a31515;"&gt;&amp;quot;EntityObject&amp;quot;&lt;/span&gt; : GetStructuralTypeName((StructuralType)Source.BaseType); } }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; TypeReferenceName { &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; GetStructuralTypeName(Source); } }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;NavigationPropertyWrapper&lt;/span&gt;&amp;gt; NavigationProperties { &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; Source.NavigationProperties.Where(n =&amp;gt; n.DeclaringType == Source).Select(n =&amp;gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;NavigationPropertyWrapper&lt;/span&gt;(n, &lt;span style="color:blue;"&gt;this&lt;/span&gt;)); } }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EntitySet&lt;/span&gt; GetEntitySet(&lt;span style="color:#2b91af;"&gt;ItemCollectionWrapper&lt;/span&gt; edm)&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; edm.SourceEntityContainers.SelectMany(c =&amp;gt; c.ObjectSetProperties).First(es =&amp;gt; es.GetAllEntityTypes(edm).Contains(Source)).Source;&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;EntityType&lt;/span&gt;&amp;gt; SubEntityTypes(&lt;span style="color:#2b91af;"&gt;ItemCollectionWrapper&lt;/span&gt; edm, &lt;span style="color:blue;"&gt;bool&lt;/span&gt; recursivity = &lt;span style="color:blue;"&gt;true&lt;/span&gt;)&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; edm.SourceEntities.Where(et =&amp;gt; et.AllBaseEntityTypes.Contains(Source)).Select(et =&amp;gt; et.Source);&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;EntityType&lt;/span&gt;&amp;gt; AllBaseEntityTypes&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; GetBaseEntityTypes(Source); }&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;EntityType&lt;/span&gt;&amp;gt; GetBaseEntityTypes(&lt;span style="color:#2b91af;"&gt;EntityType&lt;/span&gt; entityType)&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;EntityType&lt;/span&gt; baseType;&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (entityType == &lt;span style="color:blue;"&gt;null&lt;/span&gt; || (baseType = (&lt;span style="color:#2b91af;"&gt;EntityType&lt;/span&gt;)entityType.BaseType) == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;yield&lt;/span&gt; &lt;span style="color:blue;"&gt;break&lt;/span&gt;;&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;yield&lt;/span&gt; &lt;span style="color:blue;"&gt;return&lt;/span&gt; baseType;&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; subEntityType &lt;span style="color:blue;"&gt;in&lt;/span&gt; GetBaseEntityTypes(baseType))&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;yield&lt;/span&gt; &lt;span style="color:blue;"&gt;return&lt;/span&gt; subEntityType;&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Note that in your template, you probably don&amp;#39;t have the syntax colors.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Then you can use it in the rest of your template as I did in &lt;a target="_blank" href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.Demo/6470.Model1.zip"&gt;my POC&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;/// &amp;lt;summary&amp;gt; &lt;br /&gt;/// &amp;lt;#=set.SummaryComment#&amp;gt; &lt;br /&gt;/// &amp;lt;/summary&amp;gt;&amp;lt;#=set.GetLongDescriptionComment(_regionIndentLevel)#&amp;gt; &lt;br /&gt;&lt;strong&gt;/// &amp;lt;remarks&amp;gt; &lt;br /&gt;/// Entity types: &lt;br /&gt;&amp;lt;# foreach (var entityType in set.GetAllEntityTypes(Edm)) &lt;br /&gt;{ #&amp;gt; &lt;br /&gt;///&amp;nbsp; &amp;lt;#= entityType.Name #&amp;gt; &lt;br /&gt;&amp;lt;# } #&amp;gt; &lt;br /&gt;/// &amp;lt;/remarks&amp;gt; &lt;br /&gt;&lt;/strong&gt;&amp;lt;#=set.NewModifier#&amp;gt;&amp;lt;#=set.GetterAccessibility#&amp;gt; ObjectSet&amp;lt;&amp;lt;#=set.TypeName#&amp;gt;&amp;gt; &amp;lt;#=set.PropertyName#&amp;gt; &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((&amp;lt;#=set.FieldName#&amp;gt; == null)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;#=set.FieldName#&amp;gt; = base.CreateObjectSet&amp;lt;&amp;lt;#=set.TypeName#&amp;gt;&amp;gt;(&amp;quot;&amp;lt;#=set.ModelName#&amp;gt;&amp;quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return &amp;lt;#=set.FieldName#&amp;gt;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;} &lt;/p&gt;
&lt;p&gt;[&amp;hellip;]&lt;/p&gt;
&lt;p&gt;/// &amp;lt;summary&amp;gt; &lt;br /&gt;/// &amp;lt;#=entity.SummaryComment#&amp;gt; &lt;br /&gt;/// &amp;lt;/summary&amp;gt;&amp;lt;#=entity.GetLongDescriptionComment(_regionIndentLevel)#&amp;gt; &lt;br /&gt;&lt;strong&gt;/// &amp;lt;remarks&amp;gt;EntitySet &amp;lt;#= entity.GetEntitySet(Edm).Name #&amp;gt;&amp;lt;/remarks&amp;gt; &lt;br /&gt;&lt;/strong&gt;[EdmEntityTypeAttribute(NamespaceName=&amp;quot;&amp;lt;#=entity.ModelNamespace#&amp;gt;&amp;quot;, Name=&amp;quot;&amp;lt;#=entity.ModelName#&amp;gt;&amp;quot;)] &lt;br /&gt;[Serializable()] &lt;br /&gt;[DataContractAttribute(IsReference=true)] &lt;br /&gt;&amp;lt;# &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach(EntityTypeWrapper subType in Edm.GetAllDirectSubTypes(entity.Source)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;#&amp;gt; &lt;br /&gt;[KnownTypeAttribute(typeof(&amp;lt;#=subType.TypeReferenceName#&amp;gt;))] &lt;br /&gt;&amp;lt;# &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;#&amp;gt; &lt;br /&gt;&amp;lt;#=entity.TypeAccessibility#&amp;gt; &amp;lt;#=entity.AbstractOption#&amp;gt;partial class &amp;lt;#=entity.ClassName#&amp;gt; : &amp;lt;#=entity.BaseTypeName#&amp;gt; &lt;br /&gt;{ &lt;br /&gt;&amp;lt;# &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(!entity.IsAbstract) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteFactoryMethod(entity.FactoryMethodWrapper); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WritePrimitiveTypeProperties(entity, typeof(EntityObject)); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteComplexTypeProperties(entity, typeof(EntityObject)); &lt;br /&gt;#&amp;gt;&lt;/p&gt;
&lt;p&gt;I profit by this post to thank Jeff.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1720351" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/matthieu/archive/tags/.Net/default.aspx">.Net</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/Entity+Framework+_2800_EF_2900_/default.aspx">Entity Framework (EF)</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/Entity+Data+Model+_2800_EDM_2900_/default.aspx">Entity Data Model (EDM)</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/T4/default.aspx">T4</category></item><item><title>PFx is good</title><link>http://msmvps.com/blogs/matthieu/archive/2009/09/01/pfx-is-good.aspx</link><pubDate>Tue, 01 Sep 2009 20:34:06 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1719959</guid><dc:creator>Matthieu MEZIL</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/rsscomments.aspx?PostID=1719959</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/commentapi.aspx?PostID=1719959</wfw:comment><comments>http://msmvps.com/blogs/matthieu/archive/2009/09/01/pfx-is-good.aspx#comments</comments><description>&lt;p&gt;I am sure that the Parallel Framework (PFx) will take more and more importance in future developments. &lt;/p&gt;  &lt;p&gt;However, demos often are not in phase with the reality. It’s true that a fractal demo on a 1000 cores machine is ideal for parallel demo, however in real life, I never used the fractal yet and I don’t think that I am the only one in this case.&lt;/p&gt;  &lt;p&gt;So my idea was to make an example inspired from my daily work. So I made an example around… the Entity Framework. &lt;img src="http://msmvps.com/emoticons/emotion-1.gif" alt="Smile" /&gt;&lt;/p&gt;  &lt;p&gt;Imagine a DB featuring a Customers table with potentially a lot of rows (100 000 in my example which is quite a lot), a WPF application with a DataGrid to show the customers. Note that the WPF DataGrid is better than the Winforms DataGridView for this case because the WPF DataGrid loads only the visible items.&lt;/p&gt;  &lt;p&gt;The ObjectQuery class implements IListSource, so it means that we can use it as ItemsSource (the Customers property is of type ObjectSet&amp;lt;Customer&amp;gt; which inherits of ObjectQuery). Then, we add some controls to filter the items (for example, one TextBox per string column). We won’t use the MVVM pattern to avoid complicating this sample. So to filter items, we can change the DataGrid ItemsSource Customers.Where(…) instead of Customers. The result of the Where is also an ObjectQuery instance so no problem. But… this implies a new query into the DB. We should avoid executing a new SQL query each time one of the filter control’s value change. Indeed, on the Window load, we get all the customers.&lt;/p&gt;  &lt;p&gt;In addition to the useless query, we have another issue: new non persisted customers aren’t in the DataGrid since we change the filter and we can’t get it in the grid while we don’t call the context SaveChanges method. Conversely, the deleted customers still are in the grid while changes aren’t persisted. Indeed, EF queries get only the DB datas. To fix it, we can persist systematically, the add and delete and include all in a transaction so we are able to cancel the modifications however, this solution isn’t great.&lt;/p&gt;  &lt;p&gt;We need to work with the ObjectContext cache as soon as the entities are loaded. For this, we can use the ObjectStateManager property but… with the ObjectStateManager, we will have only an IEnumerable&amp;lt;Customer&amp;gt;, so we won’t be able to automate the add and the deletion.&lt;/p&gt;  &lt;p&gt;To fix it, I made my own class:&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ObjectSetDataSource&lt;/span&gt;&amp;lt;T&amp;gt; : &lt;span style="color:#2b91af;"&gt;IList&lt;/span&gt;&amp;lt;T&amp;gt;, &lt;span style="color:#2b91af;"&gt;ICollection&lt;/span&gt;&amp;lt;T&amp;gt;, &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt;, &lt;span style="color:#2b91af;"&gt;IList&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;ICollection&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;INotifyCollectionChanged&lt;/span&gt; &lt;span style="color:blue;"&gt;where&lt;/span&gt; T : &lt;span style="color:blue;"&gt;class&lt;/span&gt;, &lt;span style="color:blue;"&gt;new&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;&lt;font size="6"&gt;[…]&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; AllEntities&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;get&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (_isLoaded == &lt;span style="color:blue;"&gt;false&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; e &lt;span style="color:blue;"&gt;in&lt;/span&gt; ObjectSet)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;yield&lt;/span&gt; &lt;span style="color:blue;"&gt;return&lt;/span&gt; e;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _isLoaded = &lt;span style="color:blue;"&gt;true&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;else&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; e &lt;span style="color:blue;"&gt;in&lt;/span&gt; ObjectSet.Context.ObjectStateManager.GetObjectStateEntries(&lt;span style="color:#2b91af;"&gt;EntityState&lt;/span&gt;.Added | &lt;span style="color:#2b91af;"&gt;EntityState&lt;/span&gt;.Modified | &lt;span style="color:#2b91af;"&gt;EntityState&lt;/span&gt;.Unchanged).Select(ose =&amp;gt; ose.Entity).OfType&amp;lt;T&amp;gt;())&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;yield&lt;/span&gt; &lt;span style="color:blue;"&gt;return&lt;/span&gt; e;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; CreateEntitiesList()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _entities = &lt;span style="color:blue;"&gt;null&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (_allEntities == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _allEntities = AllEntities;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (Predicate == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _entities = _allEntities.ToList();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _entities = _allEntities.Where(Predicate).ToList();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;&lt;/span&gt;&lt;/p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;p&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;gt; Predicate&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; _predicate; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;set&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _predicate = &lt;span style="color:blue;"&gt;value&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CreateEntitiesList();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;&lt;/span&gt;&lt;/p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; OnCollectionChanged(&lt;span style="color:#2b91af;"&gt;NotifyCollectionChangedAction&lt;/span&gt;.Reset);     &lt;p&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Ok, it works. On the Window, we can use the TextChanged event like this:&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; lastNameTB_TextChanged(&lt;span style="color:blue;"&gt;object&lt;/span&gt; sender, TextChangedEventArgs e)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; Filter();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; firstNameTB_TextChanged(&lt;span style="color:blue;"&gt;object&lt;/span&gt; sender, TextChangedEventArgs e)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; Filter();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Filter()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;string&lt;/span&gt; lastName = lastNameTB.Text;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;string&lt;/span&gt; firstName = firstNameTB.Text;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; _customers.Predicate = c =&amp;gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;int&lt;/span&gt; i = 0;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;while&lt;/span&gt; (i &amp;lt; 100000) i++;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; c.LastName.StartsWith(lastName) &amp;amp;&amp;amp; c.FirstName.StartsWith(firstName);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; };&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Note the loop to slow the process in order to see better what happens.&lt;/p&gt;  &lt;p&gt;We will quickly see performance issues. Imagine that we want all the customers whose last name starts with “MEZ”.&lt;/p&gt;  &lt;p&gt;What happens?&lt;/p&gt;  &lt;p&gt;First issue: when we write MEZ, we probably write M then E and then Z. But with our sequential process, we will get the list of the customers whose last name starts with M then with ME and only then with MEZ. The problem is the fact that you can’t cancel the process because while it isn’t finished, the TextChanged event isn’t raised. Another issue is the fact that our code uses only one core of our processor and so 50% of the CPU power with my dual core:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.metablogapi/1425.image_5F00_0343BE96.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.metablogapi/8053.image_5F00_thumb_5F00_72E846DC.png" width="43" height="102" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;If we parallelize our code, we will fix the second issue:&lt;/p&gt;  &lt;p&gt;To use 100% of our CPU, we should execute our LINQ query on several threads. Indeed you can because the customers filter is independent between each customer. However, creating one thread per customer is out of the question! Tasks are very interesting for this and in our case, we will use PLINQ which is really fantastically easy to use. This is the code I propose:&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;   &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;     &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;       &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ObjectSetDataSource&lt;/span&gt;&amp;lt;T&amp;gt; : &lt;span style="color:#2b91af;"&gt;IList&lt;/span&gt;&amp;lt;T&amp;gt;, &lt;span style="color:#2b91af;"&gt;ICollection&lt;/span&gt;&amp;lt;T&amp;gt;, &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt;, &lt;span style="color:#2b91af;"&gt;IList&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;ICollection&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;INotifyCollectionChanged&lt;/span&gt; &lt;span style="color:blue;"&gt;where&lt;/span&gt; T : &lt;span style="color:blue;"&gt;class&lt;/span&gt;, &lt;span style="color:blue;"&gt;new&lt;/span&gt;()&lt;/p&gt;        &lt;p style="margin:0px;"&gt;{&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;&lt;font size="6"&gt;[…]&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; CreateEntitiesList()&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _entities = &lt;span style="color:blue;"&gt;null&lt;/span&gt;;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (_allEntities == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _allEntities = AllEntities;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (Predicate == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _entities = _allEntities.ToList();&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt;;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;&lt;strong&gt;try&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/strong&gt;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _entities = _allEntities&lt;strong&gt;.AsParallel&lt;/strong&gt;.Where(Predicate).ToList();&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;}&lt;/strong&gt;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;catch&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;OperationCanceledException&lt;/span&gt;)&lt;/strong&gt;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/strong&gt;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/strong&gt;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;gt; Predicate&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; _predicate; }&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;set&lt;/span&gt;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _predicate = &lt;span style="color:blue;"&gt;value&lt;/span&gt;;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CreateEntitiesList();&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; OnCollectionChanged(&lt;span style="color:#2b91af;"&gt;NotifyCollectionChangedAction&lt;/span&gt;.Reset); &lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;        &lt;p style="margin:0px;"&gt;}&lt;/p&gt;     &lt;/div&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;The CPU use shows a real improvement:&lt;/p&gt;      &lt;p&gt;&lt;a&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image_thumb[1]" border="0" alt="image_thumb[1]" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.metablogapi/0435.image_5F00_thumb1_5F00_4F9955DC.png" width="31" height="105" /&gt;&lt;/a&gt; &lt;/p&gt;      &lt;p&gt;Only with the AsParallel extension method, It’s hard to do it more easily! &lt;img src="http://msmvps.com/emoticons/emotion-5.gif" alt="Wink" /&gt; With this, our LINQ query is executed on all the cores of our computer. The extension method AsParallel will share the processes by splitting the source by n (2 for my dual core). Note that with execution on more than one thread, the result (without OrderBy) can be in another order than with our first code mono-threaded but in our case, it isn’t important. &lt;/p&gt;      &lt;p&gt;However, there still is the first issue: we need to be able to cancel the list process if the filter changes in order not to have to generate the lists for M and ME when the wanted filter is MEZ. Of course, PFx proposes all we need to do it:&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ObjectSetDataSource&lt;/span&gt;&amp;lt;T&amp;gt; : &lt;span style="color:#2b91af;"&gt;IList&lt;/span&gt;&amp;lt;T&amp;gt;, &lt;span style="color:#2b91af;"&gt;ICollection&lt;/span&gt;&amp;lt;T&amp;gt;, &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt;, &lt;span style="color:#2b91af;"&gt;IList&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;ICollection&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;INotifyCollectionChanged&lt;/span&gt; &lt;span style="color:blue;"&gt;where&lt;/span&gt; T : &lt;span style="color:blue;"&gt;class&lt;/span&gt;, &lt;span style="color:blue;"&gt;new&lt;/span&gt;()&lt;/p&gt;      &lt;p style="margin:0px;"&gt;{&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;&lt;font size="6"&gt;[…]&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; CreateEntitiesList()&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _entities = &lt;span style="color:blue;"&gt;null&lt;/span&gt;;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (_allEntities == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _allEntities = AllEntities;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (Predicate == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _entities = _allEntities.ToList();&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt;;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;&lt;strong&gt;try&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _entities = _allEntities&lt;strong&gt;.AsParallel().WithCancellation(_cancellationToken.Token)&lt;/strong&gt;.Where(Predicate).ToList();&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;}&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;catch&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;OperationCanceledException&lt;/span&gt;)&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;gt; Predicate&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; _predicate; }&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;set&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _predicate = &lt;span style="color:blue;"&gt;value&lt;/span&gt;;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (_cancellationToken != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _cancellationToken.Cancel();&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _cancellationToken = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CancellationTokenSource&lt;/span&gt;();&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Task&lt;/span&gt;(t =&amp;gt;&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CreateEntitiesList();&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (cancellationToken.IsCancellationRequested)&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt;;&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; app = &lt;span style="color:#2b91af;"&gt;Application&lt;/span&gt;.Current;&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (app != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; app.Dispatcher.BeginInvoke((&lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt;)(() =&amp;gt; OnCollectionChanged(&lt;span style="color:#2b91af;"&gt;NotifyCollectionChangedAction&lt;/span&gt;.Reset)));&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }, cancellationToken).Start();&lt;/strong&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;      &lt;p style="margin:0px;"&gt;}&lt;/p&gt;   &lt;/div&gt;    &lt;p style="margin:0px;"&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;The CPU use shows one more important improvement:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.metablogapi/7776.image9_5F00_58A5E15D.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image_thumb[3]" border="0" alt="image_thumb[3]" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.metablogapi/2677.image_5F00_thumb3_5F00_2C88E46C.png" width="22" height="105" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The WithCancellation extension method allows us to cancel the LINQ query during its execution. &lt;/p&gt;  &lt;p&gt;The idea to create the task in the Predicate property is to not be forced to wait the end of the M filter process and then the end of the ME filter process to finally have our MEZ filter. The task runs the filter process asynchronously and avoids the frozen UI.&lt;/p&gt;  &lt;p&gt;The last point is the BeginInvoke method which allow us to raise the CollectionChanged event into the principal thread which is inevitable to avoiding the following exception: “&lt;em&gt;This type of CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher thread”&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;This sample, very frequent, shows us the interest of using PFx. However, be careful, as all algorithms aren’t parallelisable. Moreover, the parallel code often adds more complexity and implies bringing parallelism algorithm under control. However if you have time to learn it, I suggest you very very very strongly to learn PFx and the parallelism in general. Indeed, as I wrote it at first, the Parallel Framework (PFx) will take more and more importance in the future.&lt;/p&gt;  &lt;p&gt;You can download the complete ObjectSetDataSource class &lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.PFx/5633.ObjectSetDataSource.zip" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1719959" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/matthieu/archive/tags/.Net/default.aspx">.Net</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/Entity+Framework+_2800_EF_2900_/default.aspx">Entity Framework (EF)</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/Parallel+Framework+_2800_PFx_2900_/default.aspx">Parallel Framework (PFx)</category></item><item><title>How to have FK in EF v1?</title><link>http://msmvps.com/blogs/matthieu/archive/2009/07/21/how-to-have-fk-in-ef-v1.aspx</link><pubDate>Tue, 21 Jul 2009 21:03:08 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1704735</guid><dc:creator>Matthieu MEZIL</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/rsscomments.aspx?PostID=1704735</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/commentapi.aspx?PostID=1704735</wfw:comment><comments>http://msmvps.com/blogs/matthieu/archive/2009/07/21/how-to-have-fk-in-ef-v1.aspx#comments</comments><description>&lt;p&gt;Before answering this question, I will start with another one: why do we need FK?&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;to be able to change a relationship without loading the related entity but we can already do it with the EntityReference property. &lt;/li&gt;    &lt;li&gt;for the binding &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;With the windows forms ComboBox, we don’t need it because you don’t have to systematically set the ValueMember property:&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;categoriesComboBox.DataSource = context.Categories;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;categoriesComboBox.DisplayMember = &lt;span style="color:#a31515;"&gt;&amp;quot;CategoryName&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;categoriesComboBox.DataBindings.Add(&lt;span style="color:#a31515;"&gt;&amp;quot;SelectedItem&amp;quot;&lt;/span&gt;, product, &lt;span style="color:#a31515;"&gt;&amp;quot;Category&amp;quot;&lt;/span&gt;);&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;But the problem is for the DataGridViewComboBoxColumn and the ASP DropDownList. In these cases, we really need the FK property.&lt;/p&gt;  &lt;p&gt;My first idea was to add the property:&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;partial&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Product&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; CategoryID&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; (&lt;span style="color:blue;"&gt;int&lt;/span&gt;)CategoryReference.EntityKey.EntityKeyValues.First().Value; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;set&lt;/span&gt; { CategoryReference.EntityKey = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EntityKey&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;NorthwindEntities.Categories&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;CategoryID&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;value&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Ok, it works. However, the problem is the fact that we can been tempted to use it in a LINQ To Entities query. But, of course, in this case, it fails.&lt;/p&gt;  &lt;p&gt;The binding doesn’t directly use the property of the class but the PropertyDescriptor which are, by default, generated from the properties. My idea is not to add a new property but to add a new PropertyDescriptor. For this, we have to implement the ICustomTypeDescriptor.&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;partial&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Product&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;ICustomTypeDescriptor&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;AttributeCollection&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ICustomTypeDescriptor&lt;/span&gt;.GetAttributes()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TypeDescriptor&lt;/span&gt;.GetAttributes(&lt;span style="color:blue;"&gt;this&lt;/span&gt;, &lt;span style="color:blue;"&gt;true&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;string&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ICustomTypeDescriptor&lt;/span&gt;.GetClassName()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TypeDescriptor&lt;/span&gt;.GetClassName(&lt;span style="color:blue;"&gt;this&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;string&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ICustomTypeDescriptor&lt;/span&gt;.GetComponentName()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TypeDescriptor&lt;/span&gt;.GetComponentName(&lt;span style="color:blue;"&gt;this&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;TypeConverter&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ICustomTypeDescriptor&lt;/span&gt;.GetConverter()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TypeDescriptor&lt;/span&gt;.GetConverter(&lt;span style="color:blue;"&gt;this&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;EventDescriptor&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ICustomTypeDescriptor&lt;/span&gt;.GetDefaultEvent()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TypeDescriptor&lt;/span&gt;.GetDefaultEvent(&lt;span style="color:blue;"&gt;this&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;PropertyDescriptor&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ICustomTypeDescriptor&lt;/span&gt;.GetDefaultProperty()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TypeDescriptor&lt;/span&gt;.GetDefaultProperty(&lt;span style="color:blue;"&gt;this&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;object&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ICustomTypeDescriptor&lt;/span&gt;.GetEditor(&lt;span style="color:#2b91af;"&gt;Type&lt;/span&gt; editorBaseType)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TypeDescriptor&lt;/span&gt;.GetEditor(&lt;span style="color:blue;"&gt;this&lt;/span&gt;, editorBaseType);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;EventDescriptorCollection&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ICustomTypeDescriptor&lt;/span&gt;.GetEvents(&lt;span style="color:#2b91af;"&gt;Attribute&lt;/span&gt;[] attributes)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TypeDescriptor&lt;/span&gt;.GetEvents(attributes);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;EventDescriptorCollection&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ICustomTypeDescriptor&lt;/span&gt;.GetEvents()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TypeDescriptor&lt;/span&gt;.GetEvents(&lt;span style="color:blue;"&gt;this&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;PropertyDescriptorCollection&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ICustomTypeDescriptor&lt;/span&gt;.GetProperties(&lt;span style="color:#2b91af;"&gt;Attribute&lt;/span&gt;[] attributes)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; props = &lt;span style="color:#2b91af;"&gt;TypeDescriptor&lt;/span&gt;.GetProperties(&lt;span style="color:blue;"&gt;this&lt;/span&gt;, attributes, &lt;span style="color:blue;"&gt;true&lt;/span&gt;).Cast&amp;lt;&lt;span style="color:#2b91af;"&gt;PropertyDescriptor&lt;/span&gt;&amp;gt;().ToList();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; props.Add(&lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;FKPropertyDescriptor&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Product&lt;/span&gt;&amp;gt;(p =&amp;gt; p.CategoryReference, &lt;span style="color:#a31515;"&gt;&amp;quot;CategoryID&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;CategoryCategoryID&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:blue;"&gt;int&lt;/span&gt;)));&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PropertyDescriptorCollection&lt;/span&gt;(props.ToArray());&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;PropertyDescriptorCollection&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ICustomTypeDescriptor&lt;/span&gt;.GetProperties()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; ((&lt;span style="color:#2b91af;"&gt;ICustomTypeDescriptor&lt;/span&gt;)&lt;span style="color:blue;"&gt;this&lt;/span&gt;).GetProperties(&lt;span style="color:blue;"&gt;null&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;object&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ICustomTypeDescriptor&lt;/span&gt;.GetPropertyOwner(&lt;span style="color:#2b91af;"&gt;PropertyDescriptor&lt;/span&gt; pd)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;this&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public &lt;/span&gt;&lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;FKPropertyDescriptor&lt;/span&gt;&amp;lt;T&amp;gt; : &lt;span style="color:#2b91af;"&gt;PropertyDescriptor&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Type&lt;/span&gt; _propertyDescriptorType;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style="color:#2b91af;"&gt;EntityReference&lt;/span&gt;&amp;gt; _getEntityReference;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; PropertyName { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; FKPropertyDescriptor(&lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style="color:#2b91af;"&gt;EntityReference&lt;/span&gt;&amp;gt; getEntityReference, &lt;span style="color:blue;"&gt;string&lt;/span&gt; propertyName, &lt;span style="color:blue;"&gt;string&lt;/span&gt; propertyDescriptorName, &lt;span style="color:#2b91af;"&gt;Type&lt;/span&gt; propertyDescriptorType)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;span style="color:blue;"&gt;base&lt;/span&gt;(propertyDescriptorName, &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Attribute&lt;/span&gt;[0])&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _getEntityReference = getEntityReference;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PropertyName = propertyName;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _propertyDescriptorType = propertyDescriptorType;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; CanResetValue(&lt;span style="color:blue;"&gt;object&lt;/span&gt; component)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;false&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Type&lt;/span&gt; ComponentType&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(T); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;object&lt;/span&gt; GetValue(&lt;span style="color:blue;"&gt;object&lt;/span&gt; component)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; _getEntityReference((T)component).EntityKey.EntityKeyValues.First(ekv =&amp;gt; ekv.Key == PropertyName).Value;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; IsReadOnly&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;false&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Type&lt;/span&gt; PropertyType&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; _propertyDescriptorType; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; ResetValue(&lt;span style="color:blue;"&gt;object&lt;/span&gt; component)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; SetValue(&lt;span style="color:blue;"&gt;object&lt;/span&gt; component, &lt;span style="color:blue;"&gt;object&lt;/span&gt; value)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; entityKey = _getEntityReference((T)component).EntityKey;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _getEntityReference((T)component).EntityKey = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EntityKey&lt;/span&gt;(&lt;span style="color:blue;"&gt;string&lt;/span&gt;.Concat(entityKey.EntityContainerName, &lt;span style="color:#a31515;"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;, entityKey.EntitySetName), entityKey.EntityKeyValues.Where(ekm =&amp;gt; ekm.Key != PropertyName).Union(&lt;span style="color:blue;"&gt;new&lt;/span&gt;[] { &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EntityKeyMember&lt;/span&gt;(PropertyName, value) }));&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; ShouldSerializeValue(&lt;span style="color:blue;"&gt;object&lt;/span&gt; component)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;false&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Great, it works!&lt;/p&gt;  &lt;p&gt;However, it would be very boring to do it for each FK!&lt;/p&gt;  &lt;p&gt;As &lt;a href="http://blogs.msdn.com/dsimmons" target="_blank"&gt;Danny&lt;/a&gt; wrote &lt;a href="http://blogs.msdn.com/dsimmons/archive/2008/10/27/using-t4-templates-to-generate-ef-classes.aspx" target="_blank"&gt;here&lt;/a&gt;, it’s possible to use the T4 template with VS 2008.&amp;#160; So my idea is to change the default template to add it automatically.&lt;/p&gt;  &lt;p&gt;You can download it &lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.Demo/3644.FKTT.zip" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The most important part of &lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.Demo/3644.FKTT.zip" target="_blank"&gt;the template&lt;/a&gt; is this one:&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties(Attribute[] attributes)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; var props = TypeDescriptor.GetProperties(this, attributes, true).Cast&amp;lt;PropertyDescriptor&amp;gt;().ToList();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;lt;#&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; foreach(NavigationProperty property in entity.NavigationProperties.Where(n =&amp;gt; n.DeclaringType == entity &amp;amp;&amp;amp; n.ToEndMember.RelationshipMultiplicity != RelationshipMultiplicity.Many))&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string elementTypeName = GetEntityType(property.ToEndMember).Name;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; EntityType elementType = Edm.AllEntities.First(et =&amp;gt; et.Name == elementTypeName);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; foreach (EdmMember keyMember in elementType.KeyMembers)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string keyMemberName = keyMember.Name;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;#&amp;gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; props.Add(new FKPropertyDescriptor&amp;lt;&amp;lt;#= entity.Name #&amp;gt;&amp;gt;(p =&amp;gt; p.&amp;lt;#= property.Name #&amp;gt;Reference, &amp;quot;&amp;lt;#= keyMemberName #&amp;gt;&amp;quot;, &amp;quot;&amp;lt;#= string.Concat(property.Name, keyMemberName) #&amp;gt;&amp;quot;, typeof(&amp;lt;#= new CSharpCodeLanguage().Format(keyMember.TypeUsage) #&amp;gt;)));&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;lt;#&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;#&amp;gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; return new PropertyDescriptorCollection(props.ToArray());&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;What is cool now is the fact that with zero effort, you can use the FK in your bindings. &lt;/p&gt;  &lt;p&gt;Enjoy &lt;img src="http://msmvps.com/emoticons/emotion-1.gif" alt="Smile" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1704735" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/matthieu/archive/tags/.Net/default.aspx">.Net</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/Entity+Framework+_2800_EF_2900_/default.aspx">Entity Framework (EF)</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/T4/default.aspx">T4</category></item><item><title>T4 for View Generation</title><link>http://msmvps.com/blogs/matthieu/archive/2009/06/29/t4-for-view-generation.aspx</link><pubDate>Mon, 29 Jun 2009 23:49:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1697218</guid><dc:creator>Matthieu MEZIL</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/rsscomments.aspx?PostID=1697218</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/commentapi.aspx?PostID=1697218</wfw:comment><comments>http://msmvps.com/blogs/matthieu/archive/2009/06/29/t4-for-view-generation.aspx#comments</comments><description>&lt;p&gt;EF team blogged about it &lt;a target="_blank" href="http://blogs.msdn.com/adonet/archive/2008/06/20/how-to-use-a-t4-template-for-view-generation.aspx"&gt;here&lt;/a&gt; and I think that it&amp;rsquo;s very useful. &lt;/p&gt;
&lt;p&gt;First, I think that it&amp;rsquo;s easier to use than Edmgen.&lt;/p&gt;
&lt;p&gt;Moreover, contrary to EdmGen, it allows you to use embedded metadata artifacts.&lt;/p&gt;
&lt;p&gt;If you want to use &lt;a target="_blank" href="http://blogs.msdn.com/adonet/attachment/8626631.ashx"&gt;the MS T4 template&lt;/a&gt; with VS 2010, &lt;span style="text-decoration:underline;"&gt;don&amp;rsquo;t forget&lt;/span&gt; to change the xml namespaces.&lt;/p&gt;
&lt;p&gt;XNamespace edmxns = &amp;quot;http://schemas.microsoft.com/ado/2008/10/edmx&amp;quot;; &lt;br /&gt;XNamespace csdlns = &amp;quot;http://schemas.microsoft.com/ado/2008/09/edm&amp;quot;; &lt;br /&gt;XNamespace mslns = &amp;quot;http://schemas.microsoft.com/ado/2008/09/mapping/cs&amp;quot;; &lt;br /&gt;XNamespace ssdlns = &amp;quot;http://schemas.microsoft.com/ado/2009/02/edm/ssdl&amp;quot;; &lt;/p&gt;
&lt;p&gt;So you should have the following:&lt;/p&gt;
&lt;p&gt;&amp;lt;#@ template language=&amp;quot;C#&amp;quot; hostspecific=&amp;quot;true&amp;quot;#&amp;gt; &lt;br /&gt;&amp;lt;#@ output extension=&amp;quot;.cs&amp;quot; #&amp;gt; &lt;/p&gt;
&lt;p&gt;&amp;lt;#@ assembly name=&amp;quot;System.Core&amp;quot; #&amp;gt; &lt;br /&gt;&amp;lt;#@ assembly name=&amp;quot;System.Data&amp;quot; #&amp;gt; &lt;br /&gt;&amp;lt;#@ assembly name=&amp;quot;System.Data.Entity&amp;quot; #&amp;gt; &lt;br /&gt;&amp;lt;#@ assembly name=&amp;quot;System.Data.Entity.Design&amp;quot; #&amp;gt; &lt;br /&gt;&amp;lt;#@ assembly name=&amp;quot;System.Xml&amp;quot; #&amp;gt; &lt;br /&gt;&amp;lt;#@ assembly name=&amp;quot;System.Xml.Linq&amp;quot; #&amp;gt; &lt;/p&gt;
&lt;p&gt;&amp;lt;#@ import namespace=&amp;quot;System&amp;quot; #&amp;gt; &lt;br /&gt;&amp;lt;#@ import namespace=&amp;quot;System.IO&amp;quot; #&amp;gt; &lt;br /&gt;&amp;lt;#@ import namespace=&amp;quot;System.Diagnostics&amp;quot; #&amp;gt; &lt;br /&gt;&amp;lt;#@ import namespace=&amp;quot;System.Text&amp;quot; #&amp;gt; &lt;br /&gt;&amp;lt;#@ import namespace=&amp;quot;System.Collections.Generic&amp;quot; #&amp;gt; &lt;br /&gt;&amp;lt;#@ import namespace=&amp;quot;System.Data.Entity.Design&amp;quot; #&amp;gt; &lt;br /&gt;&amp;lt;#@ import namespace=&amp;quot;System.Data.Metadata.Edm&amp;quot; #&amp;gt; &lt;br /&gt;&amp;lt;#@ import namespace=&amp;quot;System.Data.Mapping&amp;quot; #&amp;gt; &lt;br /&gt;&amp;lt;#@ import namespace=&amp;quot;System.Xml&amp;quot; #&amp;gt; &lt;br /&gt;&amp;lt;#@ import namespace=&amp;quot;System.Xml.Linq&amp;quot; #&amp;gt; &lt;/p&gt;
&lt;p&gt;&amp;lt;# &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Find EDMX file to process: Model1.Views.tt generates views for Model1.EDMX &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string edmxFileName = Path.GetFileNameWithoutExtension(this.Host.TemplateFile).ToLowerInvariant().Replace(&amp;quot;.views&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;.edmx&amp;quot;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string edmxFilePath = Path.Combine(Path.GetDirectoryName(this.Host.TemplateFile), edmxFileName); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (File.Exists(edmxFilePath)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Call helper class to generate pre-compiled views and write to output &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.WriteLine(GenerateViews(edmxFilePath)); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Error(String.Format(&amp;quot;No views were generated. Cannot find file {0}. Ensure the project has an EDMX file and the file name of the .tt file is of the form [edmx-file-name].Views.tt&amp;quot;, edmxFilePath)); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // All done! &lt;br /&gt;#&amp;gt; &lt;/p&gt;
&lt;p&gt;&amp;lt;#+ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String GenerateViews(string edmxFilePath) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String generatedViews = String.Empty; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (StreamWriter writer = new StreamWriter(new MemoryStream())) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlReader csdlReader = null; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlReader mslReader = null; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlReader ssdlReader = null; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Crack open the EDMX file and get readers over the CSDL, MSL and SSDL portions &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetConceptualMappingAndStorageReaders(edmxFilePath, out csdlReader, out mslReader, out ssdlReader); &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Initialize item collections &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EdmItemCollection edmItems = new EdmItemCollection(new XmlReader[] { csdlReader }); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StoreItemCollection storeItems = new StoreItemCollection(new XmlReader[] { ssdlReader }); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StorageMappingItemCollection mappingItems = new StorageMappingItemCollection(edmItems, storeItems, new XmlReader[] { mslReader }); &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Initialize the view generator to generate views in C# &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EntityViewGenerator viewGenerator = new EntityViewGenerator(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; viewGenerator.LanguageOption = LanguageOption.GenerateCSharpCode; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IList&amp;lt;EdmSchemaError&amp;gt; errors = viewGenerator.GenerateViews(mappingItems, writer); &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (EdmSchemaError e in errors) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // log error &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Error(e.Message); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MemoryStream memStream = writer.BaseStream as MemoryStream; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; generatedViews = Encoding.UTF8.GetString(memStream.ToArray()); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (Exception ex) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // log error &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Error(ex.ToString()); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return generatedViews; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void GetConceptualMappingAndStorageReaders(string edmxFile, out XmlReader csdlReader, out XmlReader mslReader, out XmlReader ssdlReader) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; csdlReader = null; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mslReader = null; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ssdlReader = null; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XNamespace edmxns = &amp;quot;&lt;a href="http://schemas.microsoft.com/ado/2008/10/edmx&amp;quot;;"&gt;http://schemas.microsoft.com/ado/2008/10/edmx&amp;quot;;&lt;/a&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XNamespace csdlns = &amp;quot;&lt;a href="http://schemas.microsoft.com/ado/2008/09/edm&amp;quot;;"&gt;http://schemas.microsoft.com/ado/2008/09/edm&amp;quot;;&lt;/a&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XNamespace mslns = &amp;quot;&lt;a href="http://schemas.microsoft.com/ado/2008/09/mapping/cs&amp;quot;;"&gt;http://schemas.microsoft.com/ado/2008/09/mapping/cs&amp;quot;;&lt;/a&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XNamespace ssdlns = &amp;quot;&lt;a href="http://schemas.microsoft.com/ado/2009/02/edm/ssdl&amp;quot;;"&gt;http://schemas.microsoft.com/ado/2009/02/edm/ssdl&amp;quot;;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XDocument edmxDoc = XDocument.Load(edmxFile); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (edmxDoc != null) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XElement edmxNode = edmxDoc.Element(edmxns + &amp;quot;Edmx&amp;quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (edmxNode != null) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XElement runtimeNode = edmxNode.Element(edmxns + &amp;quot;Runtime&amp;quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (runtimeNode != null) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Create XmlReader over CSDL in EDMX &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XElement conceptualModelsNode = runtimeNode.Element(edmxns + &amp;quot;ConceptualModels&amp;quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (conceptualModelsNode != null) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XElement csdlContent = conceptualModelsNode.Element(csdlns + &amp;quot;Schema&amp;quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (csdlContent != null) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; csdlReader = csdlContent.CreateReader(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Create XmlReader over MSL in EDMX &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XElement mappingsNode = runtimeNode.Element(edmxns + &amp;quot;Mappings&amp;quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (mappingsNode != null) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XElement mslContent = mappingsNode.Element(mslns + &amp;quot;Mapping&amp;quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (mslContent != null) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mslReader = mslContent.CreateReader(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Create XmlReader over SSDL in EDMX &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XElement storageModelsNode = runtimeNode.Element(edmxns + &amp;quot;StorageModels&amp;quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (storageModelsNode != null) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XElement ssdlContent = storageModelsNode.Element(ssdlns + &amp;quot;Schema&amp;quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ssdlContent != null) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ssdlReader = ssdlContent.CreateReader(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;#&amp;gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1697218" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/matthieu/archive/tags/.Net/default.aspx">.Net</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/Entity+Framework+_2800_EF_2900_/default.aspx">Entity Framework (EF)</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/T4/default.aspx">T4</category></item><item><title>POCO T4</title><link>http://msmvps.com/blogs/matthieu/archive/2009/06/26/poco-t4.aspx</link><pubDate>Fri, 26 Jun 2009 08:23:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1696772</guid><dc:creator>Matthieu MEZIL</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/rsscomments.aspx?PostID=1696772</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/commentapi.aspx?PostID=1696772</wfw:comment><comments>http://msmvps.com/blogs/matthieu/archive/2009/06/26/poco-t4.aspx#comments</comments><description>&lt;p&gt;With EF4 features CTP1, we have a great POCO template which is divided in two tt files to allow us to have the entitiy POCO classes and the context in different projects.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s very very cool.&lt;/p&gt;
&lt;p&gt;However, I think that it&amp;rsquo;s a shame not to have an interface for the context particularly to mock it.&lt;/p&gt;
&lt;p&gt;So I change the .Context.tt like this:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;lt;#@ template language=&amp;quot;C#&amp;quot; debug=&amp;quot;false&amp;quot; hostspecific=&amp;quot;true&amp;quot;#&amp;gt; &lt;br /&gt;&amp;lt;#@ include file=&amp;quot;EF.Utility.ctp.CS.ttinclude&amp;quot;#&amp;gt;&amp;lt;#@ &lt;br /&gt;output extension=&amp;quot;.cs&amp;quot;#&amp;gt;&amp;lt;# &lt;br /&gt;// Copyright (c) Microsoft Corporation.&amp;nbsp; All rights reserved. &lt;/p&gt;
&lt;p&gt;CodeGenerationTools code = new CodeGenerationTools(this); &lt;br /&gt;MetadataLoader loader = new MetadataLoader(this); &lt;br /&gt;CodeRegion region = new CodeRegion(this, 1); &lt;br /&gt;MetadataTools ef = new MetadataTools(this); &lt;/p&gt;
&lt;p&gt;string inputFile = @&amp;quot;Northwind.edmx&amp;quot;; &lt;br /&gt;EdmItemCollection ItemCollection = loader.CreateEdmItemCollection(inputFile); &lt;br /&gt;string namespaceName = code.VsNamespaceSuggestion(); &lt;/p&gt;
&lt;p&gt;TemplateFileManager fileManager = TemplateFileManager.Create(this); &lt;br /&gt;EntityContainer container = ItemCollection.GetItems&amp;lt;EntityContainer&amp;gt;().FirstOrDefault(); &lt;br /&gt;if (container == null) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return &amp;quot;// No EntityContainer exists in the model, so no code was generated&amp;quot;; &lt;br /&gt;} &lt;/p&gt;
&lt;p&gt;// Emit Entity Types &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string interfaceName = &amp;quot;I&amp;quot; + code.Escape(container); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fileManager.StartNewFile(interfaceName + &amp;quot;.cs&amp;quot;); &lt;br /&gt;#&amp;gt; &lt;br /&gt;using System; &lt;br /&gt;using System.Collections.Generic; &lt;br /&gt;using System.Data.Objects; &lt;br /&gt;using System.Data.EntityClient; &lt;br /&gt;using Entities; &lt;/p&gt;
&lt;p&gt;&amp;lt;# &lt;br /&gt;if (!String.IsNullOrEmpty(namespaceName)) &lt;br /&gt;{ &lt;br /&gt;#&amp;gt; &lt;br /&gt;namespace &amp;lt;#=code.EscapeNamespace(namespaceName)#&amp;gt; &lt;br /&gt;{ &lt;br /&gt;&amp;lt;# &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PushIndent(CodeRegion.GetIndent(1)); &lt;br /&gt;} &lt;br /&gt;#&amp;gt; &lt;br /&gt;&amp;lt;#=Accessibility.ForType(container)#&amp;gt; interface &amp;lt;#=interfaceName#&amp;gt; &lt;br /&gt;{ &lt;br /&gt;&amp;lt;# &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (EntitySet entitySet in container.BaseEntitySets.OfType&amp;lt;EntitySet&amp;gt;()) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;#&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IObjectSet&amp;lt;&amp;lt;#=code.Escape(entitySet.ElementType)#&amp;gt;&amp;gt; &amp;lt;#=code.Escape(entitySet)#&amp;gt; { get; } &lt;br /&gt;&amp;lt;# &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;#&amp;gt; &lt;br /&gt;&amp;lt;# &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (container.FunctionImports.Any()) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;#&amp;gt; &lt;/p&gt;
&lt;p&gt;&amp;lt;# &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (EdmFunction edmFunction in container.FunctionImports) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var parameters = FunctionImportParameter.Create(edmFunction.Parameters, code, ef); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string paramList = String.Join(&amp;quot;, &amp;quot;, parameters.Select(p =&amp;gt; p.FunctionParameterType + &amp;quot; &amp;quot; + p.FunctionParameterName).ToArray()); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(edmFunction.ReturnParameter == null) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; continue; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string returnTypeElement = code.Escape(ef.GetElementType(edmFunction.ReturnParameter.TypeUsage)); &lt;/p&gt;
&lt;p&gt;#&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IEnumerable&amp;lt;&amp;lt;#=returnTypeElement#&amp;gt;&amp;gt; &amp;lt;#=code.Escape(edmFunction)#&amp;gt;(&amp;lt;#=paramList#&amp;gt;); &lt;br /&gt;&amp;lt;# &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;#&amp;gt; &lt;br /&gt;} &lt;br /&gt;&amp;lt;# &lt;br /&gt;if (!String.IsNullOrEmpty(namespaceName)) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PopIndent(); &lt;br /&gt;#&amp;gt; &lt;br /&gt;} &lt;br /&gt;&amp;lt;# &lt;br /&gt;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fileManager.WriteFiles(); &lt;br /&gt;#&amp;gt; &lt;br /&gt;//------------------------------------------------------------------------------ &lt;br /&gt;// &amp;lt;auto-generated&amp;gt; &lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; This code was generated from a template. &lt;br /&gt;// &lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Changes to this file may cause incorrect behavior and will be lost if &lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; the code is regenerated. &lt;br /&gt;// &amp;lt;/auto-generated&amp;gt; &lt;br /&gt;//------------------------------------------------------------------------------ &lt;/p&gt;
&lt;p&gt;using System; &lt;br /&gt;using System.Collections.Generic; &lt;br /&gt;using System.Data.Objects; &lt;br /&gt;using System.Data.EntityClient; &lt;br /&gt;using Entities; &lt;/p&gt;
&lt;p&gt;&amp;lt;# &lt;br /&gt;if (!String.IsNullOrEmpty(namespaceName)) &lt;br /&gt;{ &lt;br /&gt;#&amp;gt; &lt;br /&gt;namespace &amp;lt;#=code.EscapeNamespace(namespaceName)#&amp;gt; &lt;br /&gt;{ &lt;br /&gt;&amp;lt;# &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PushIndent(CodeRegion.GetIndent(1)); &lt;br /&gt;} &lt;br /&gt;#&amp;gt; &lt;br /&gt;&amp;lt;#=Accessibility.ForType(container)#&amp;gt; partial class &amp;lt;#=code.Escape(container)#&amp;gt; : ObjectContext, &amp;lt;#= interfaceName #&amp;gt; &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public const string ConnectionString = &amp;quot;name=&amp;lt;#=container.Name#&amp;gt;&amp;quot;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public const string ContainerName = &amp;quot;&amp;lt;#=container.Name#&amp;gt;&amp;quot;; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region Constructors &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public &amp;lt;#=code.Escape(container)#&amp;gt;() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : base(ConnectionString, ContainerName) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ContextOptions.DeferredLoadingEnabled = true; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public &amp;lt;#=code.Escape(container)#&amp;gt;(string connectionString) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : base(connectionString, ContainerName) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ContextOptions.DeferredLoadingEnabled = true; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public &amp;lt;#=code.Escape(container)#&amp;gt;(EntityConnection connection) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : base(connection, ContainerName) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ContextOptions.DeferredLoadingEnabled = true; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion &lt;/p&gt;
&lt;p&gt;&amp;lt;# &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; region.Begin(&amp;quot;ObjectSet Properties&amp;quot;); &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (EntitySet entitySet in container.BaseEntitySets.OfType&amp;lt;EntitySet&amp;gt;()) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;#&amp;gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;#=AccessibilityAndVirtual(Accessibility.ForReadOnlyProperty(entitySet))#&amp;gt; ObjectSet&amp;lt;&amp;lt;#=code.Escape(entitySet.ElementType)#&amp;gt;&amp;gt; &amp;lt;#=code.Escape(entitySet)#&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return &amp;lt;#=code.FieldName(entitySet) #&amp;gt;&amp;nbsp; ?? (&amp;lt;#=code.FieldName(entitySet)#&amp;gt; = CreateObjectSet&amp;lt;&amp;lt;#=code.Escape(entitySet.ElementType)#&amp;gt;&amp;gt;(&amp;quot;&amp;lt;#=entitySet.Name#&amp;gt;&amp;quot;)); } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private ObjectSet&amp;lt;&amp;lt;#=code.Escape(entitySet.ElementType)#&amp;gt;&amp;gt; &amp;lt;#=code.FieldName(entitySet)#&amp;gt;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IObjectSet&amp;lt;&amp;lt;#=code.Escape(entitySet.ElementType)#&amp;gt;&amp;gt; &amp;lt;#=interfaceName#&amp;gt;.&amp;lt;#=code.Escape(entitySet)#&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return &amp;lt;#=code.Escape(entitySet)#&amp;gt;; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;lt;# &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; region.End(); &lt;br /&gt;#&amp;gt; &lt;/p&gt;
&lt;p&gt;&amp;lt;# &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; region.Begin(&amp;quot;Function Imports&amp;quot;); &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (EdmFunction edmFunction in container.FunctionImports) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var parameters = FunctionImportParameter.Create(edmFunction.Parameters, code, ef); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string paramList = String.Join(&amp;quot;, &amp;quot;, parameters.Select(p =&amp;gt; p.FunctionParameterType + &amp;quot; &amp;quot; + p.FunctionParameterName).ToArray()); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(edmFunction.ReturnParameter == null) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; continue; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string returnTypeElement = code.Escape(ef.GetElementType(edmFunction.ReturnParameter.TypeUsage)); &lt;/p&gt;
&lt;p&gt;#&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;#=AccessibilityAndVirtual(Accessibility.ForMethod(edmFunction))#&amp;gt; ObjectResult&amp;lt;&amp;lt;#=returnTypeElement#&amp;gt;&amp;gt; &amp;lt;#=code.Escape(edmFunction)#&amp;gt;(&amp;lt;#=paramList#&amp;gt;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;lt;# &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (var parameter in parameters) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!parameter.NeedsLocalVariable) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; continue; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;#&amp;gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ObjectParameter &amp;lt;#=parameter.LocalVariableName#&amp;gt;; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (&amp;lt;#=parameter.IsNullableOfT ? parameter.FunctionParameterName + &amp;quot;.HasValue&amp;quot; : parameter.FunctionParameterName + &amp;quot; != null&amp;quot;#&amp;gt;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;#=parameter.LocalVariableName#&amp;gt; = new ObjectParameter(&amp;quot;&amp;lt;#=parameter.EsqlParameterName#&amp;gt;&amp;quot;, &amp;lt;#=parameter.FunctionParameterName#&amp;gt;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;#=parameter.LocalVariableName#&amp;gt; = new ObjectParameter(&amp;quot;&amp;lt;#=parameter.EsqlParameterName#&amp;gt;&amp;quot;, typeof(&amp;lt;#=parameter.RawClrTypeName#&amp;gt;)); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;lt;# &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;#&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return base.ExecuteFunction&amp;lt;&amp;lt;#=returnTypeElement#&amp;gt;&amp;gt;(&amp;quot;&amp;lt;#=edmFunction.Name#&amp;gt;&amp;quot;&amp;lt;#=code.StringBefore(&amp;quot;, &amp;quot;, string.Join(&amp;quot;, &amp;quot;, parameters.Select(p =&amp;gt; p.ExecuteParameterName).ToArray()))#&amp;gt;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IEnumerable&amp;lt;&amp;lt;#=returnTypeElement#&amp;gt;&amp;gt; &amp;lt;#=interfaceName#&amp;gt;.&amp;lt;#=code.Escape(edmFunction)#&amp;gt;(&amp;lt;#=paramList#&amp;gt;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return &amp;lt;#=code.Escape(edmFunction)#&amp;gt;(&amp;lt;#=String.Join(&amp;quot;, &amp;quot;, parameters.Select(p =&amp;gt; p.FunctionParameterName).ToArray())#&amp;gt;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;lt;# &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; region.End(); &lt;br /&gt;#&amp;gt; &lt;br /&gt;} &lt;br /&gt;&amp;lt;# &lt;br /&gt;if (!String.IsNullOrEmpty(namespaceName)) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PopIndent(); &lt;br /&gt;#&amp;gt; &lt;br /&gt;} &lt;br /&gt;&amp;lt;# &lt;br /&gt;} &lt;br /&gt;#&amp;gt; &lt;br /&gt;&amp;lt;#+ &lt;br /&gt;string AccessibilityAndVirtual(string accessibility) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (accessibility != &amp;quot;private&amp;quot;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return accessibility + &amp;quot; virtual&amp;quot;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return accessibility; &lt;br /&gt;} &lt;br /&gt;#&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Enjoy &lt;img src="http://msmvps.com/emoticons/emotion-1.gif" alt="Smile" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1696772" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/matthieu/archive/tags/.Net/default.aspx">.Net</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/Entity+Framework+_2800_EF_2900_/default.aspx">Entity Framework (EF)</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/T4/default.aspx">T4</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/TDD/default.aspx">TDD</category></item><item><title>SubObjectSet</title><link>http://msmvps.com/blogs/matthieu/archive/2009/06/16/subobjectset.aspx</link><pubDate>Tue, 16 Jun 2009 17:22:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1695638</guid><dc:creator>Matthieu MEZIL</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/rsscomments.aspx?PostID=1695638</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/commentapi.aspx?PostID=1695638</wfw:comment><comments>http://msmvps.com/blogs/matthieu/archive/2009/06/16/subobjectset.aspx#comments</comments><description>&lt;p&gt;With EF, when you use TPH or TPC inheritance mapping scenarii, the EntitySet is on the base class. &lt;/p&gt;
&lt;p&gt;As I mentioned often in the past with EF v1, you can add a property in your context which returns the EntitySet.OfType&amp;lt;MySubType&amp;gt;().&lt;/p&gt;
&lt;p&gt;Ok it&amp;rsquo;s interesting but&amp;hellip; In EF v1, the EntitySet is an ObjectQuery&amp;lt;T&amp;gt; property and our property also but in EF v2 the EntitySet is an ObjectSet&amp;lt;T&amp;gt;. This class implements the IObjectSet&amp;lt;T&amp;gt; interface which has three methods to add, attach and delete entities.&lt;/p&gt;
&lt;p&gt;One guy&amp;nbsp;tells me that he wants to be able to use these methods directly on the &amp;ldquo;sub EntitySet&amp;rdquo; property.&lt;/p&gt;
&lt;p&gt;To realize it, I made the following class:&lt;/p&gt;
&lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SubObjectSet&lt;/span&gt;&amp;lt;TBase, TInherited&amp;gt; : &lt;span style="color:#2b91af;"&gt;ObjectQuery&lt;/span&gt;&amp;lt;TInherited&amp;gt;, &lt;span style="color:#2b91af;"&gt;IObjectSet&lt;/span&gt;&amp;lt;TInherited&amp;gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;where&lt;/span&gt; TBase : &lt;span style="color:blue;"&gt;class&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;where&lt;/span&gt; TInherited : &lt;span style="color:blue;"&gt;class&lt;/span&gt;, TBase&lt;/p&gt;
&lt;p style="margin:0px;"&gt;{&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ObjectSet&lt;/span&gt;&amp;lt;TBase&amp;gt; ObjectSet { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; SubObjectSet(&lt;span style="color:#2b91af;"&gt;ObjectSet&lt;/span&gt;&amp;lt;TBase&amp;gt; objectSet)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : &lt;span style="color:blue;"&gt;base&lt;/span&gt;(objectSet.OfType&amp;lt;TInherited&amp;gt;().CommandText, objectSet.Context)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ObjectSet = objectSet;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region&lt;/span&gt; IObjectSet&amp;lt;TInherited&amp;gt; Members&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; AddObject(TInherited entity)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ObjectSet.AddObject(entity);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Attach(TInherited entity)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ObjectSet.Attach(entity);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; DeleteObject(TInherited entity)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ObjectSet.DeleteObject(entity);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1695638" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/matthieu/archive/tags/.Net/default.aspx">.Net</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/Entity+Framework+_2800_EF_2900_/default.aspx">Entity Framework (EF)</category></item><item><title>Entity Framework v2: How to get only one entity easier with EF4</title><link>http://msmvps.com/blogs/matthieu/archive/2009/06/12/entity-framework-how-to-get-only-one-entity-easier-with-ef4.aspx</link><pubDate>Sat, 13 Jun 2009 01:26:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1695104</guid><dc:creator>Matthieu MEZIL</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/rsscomments.aspx?PostID=1695104</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/commentapi.aspx?PostID=1695104</wfw:comment><comments>http://msmvps.com/blogs/matthieu/archive/2009/06/12/entity-framework-how-to-get-only-one-entity-easier-with-ef4.aspx#comments</comments><description>&lt;p&gt;&lt;a target="_blank" href="http://blogs.msdn.com/alexj/archive/2009/06/11/tip-25-how-to-get-entities-by-key-the-easy-way.aspx"&gt;Alex James wrote an extension method which allows to get only one entity from a query and the entity key&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If we have the key, I think it&amp;rsquo;s useless to allow it for all queries and it&amp;rsquo;s useful only for EntitySet. With EF4, this extension method can be applied on ObjectSet class instead of ObjectQuery class.&lt;/p&gt;
&lt;p&gt;// In the first version of Entity Framework, the ObjectSet class doesn&amp;rsquo;t exist, EntitySet were some ObjectQuery. &lt;/p&gt;
&lt;p&gt;// ObjectSet&amp;lt;T&amp;gt; class inherits from ObjectQuery&amp;lt;T&amp;gt;&lt;/p&gt;
&lt;p&gt;This simplifies the code because we can directly use the (Try)GetObjectByKey method:&lt;/p&gt;
&lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ObjectSetExtension&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;{&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; T Get&amp;lt;T&amp;gt;(&lt;span style="color:blue;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ObjectSet&lt;/span&gt;&amp;lt;T&amp;gt; objectSet, &lt;span style="color:blue;"&gt;object&lt;/span&gt; key) &lt;span style="color:blue;"&gt;where&lt;/span&gt; T : &lt;span style="color:blue;"&gt;class&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;object&lt;/span&gt; value;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; objectSet.Context.TryGetObjectByKey(&lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EntityKey&lt;/span&gt;(&lt;span style="color:blue;"&gt;string&lt;/span&gt;.Concat(objectSet.Context.DefaultContainerName, &lt;span style="color:#a31515;"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;, objectSet.EntitySet.Name), objectSet.EntitySet.ElementType.KeyMembers.Single().Name, key), &lt;span style="color:blue;"&gt;out&lt;/span&gt; value);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; (T)value;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; T Get&amp;lt;T&amp;gt;(&lt;span style="color:blue;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ObjectSet&lt;/span&gt;&amp;lt;T&amp;gt; objectSet, &lt;span style="color:blue;"&gt;params&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EntityKeyMember&lt;/span&gt;[] keys) &lt;span style="color:blue;"&gt;where&lt;/span&gt; T : &lt;span style="color:blue;"&gt;class&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;object&lt;/span&gt; value;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; objectSet.Context.TryGetObjectByKey(&lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EntityKey&lt;/span&gt;(&lt;span style="color:blue;"&gt;string&lt;/span&gt;.Concat(objectSet.Context.DefaultContainerName, &lt;span style="color:#a31515;"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;, objectSet.EntitySet.Name), keys), &lt;span style="color:blue;"&gt;out&lt;/span&gt; value);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; (T)value;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;We can use&amp;nbsp;the second extension method&amp;nbsp;for&amp;nbsp;entities with composite key.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1695104" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/matthieu/archive/tags/.Net/default.aspx">.Net</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/Entity+Framework+_2800_EF_2900_/default.aspx">Entity Framework (EF)</category></item><item><title>Entity Framework: Undo Redo v2</title><link>http://msmvps.com/blogs/matthieu/archive/2009/06/10/entity-framework-undo-redo-v2.aspx</link><pubDate>Wed, 10 Jun 2009 07:12:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1694878</guid><dc:creator>Matthieu MEZIL</dc:creator><slash:comments>8</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/rsscomments.aspx?PostID=1694878</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/commentapi.aspx?PostID=1694878</wfw:comment><comments>http://msmvps.com/blogs/matthieu/archive/2009/06/10/entity-framework-undo-redo-v2.aspx#comments</comments><description>&lt;p&gt;After &lt;a target="_blank" href="http://msmvps.com/blogs/matthieu/archive/2009/06/08/ef-undo-redo.aspx"&gt;my first Undo Redo POC version&lt;/a&gt;, one of my customers wanted to be able to manage many actions per Undo / Redo.&lt;/p&gt;
&lt;p&gt;So I added two extension methods: BeginGroupOfUndoActions and EndGroupOfUndoActions.&lt;/p&gt;
&lt;p&gt;My code is now this one: &lt;/p&gt;
&lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;span style="color:blue;"&gt;
&lt;div style="font-family:Courier New;background:white;color:black;font-size:10pt;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ObjectContextExtension&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;{&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;ObjectContext&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;ObjectContextUndoRedo&lt;/span&gt;&amp;gt; _objectContextUndoRedo = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;ObjectContext&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;ObjectContextUndoRedo&lt;/span&gt;&amp;gt;();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; ActivateUndoRedoTracking(&lt;span style="color:blue;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ObjectContext&lt;/span&gt; context, &lt;span style="color:blue;"&gt;int&lt;/span&gt; undoStackLength)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;ObjectContextUndoRedo&lt;/span&gt; objectContextUndoRedo;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _objectContextUndoRedo.TryGetValue(context, &lt;span style="color:blue;"&gt;out&lt;/span&gt; objectContextUndoRedo);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (objectContextUndoRedo == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; objectContextUndoRedo = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ObjectContextUndoRedo&lt;/span&gt; { Context = context };&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _objectContextUndoRedo.Add(context, objectContextUndoRedo);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; objectContextUndoRedo.ActivateUndoRedoTracking(undoStackLength);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; CanUndo(&lt;span style="color:blue;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ObjectContext&lt;/span&gt; context)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;ObjectContextUndoRedo&lt;/span&gt; objectContextUndoRedo;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _objectContextUndoRedo.TryGetValue(context, &lt;span style="color:blue;"&gt;out&lt;/span&gt; objectContextUndoRedo);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (objectContextUndoRedo == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;throw&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;InvalidOperationException&lt;/span&gt;();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; objectContextUndoRedo.CanUndo;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Undo(&lt;span style="color:blue;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ObjectContext&lt;/span&gt; context)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;ObjectContextUndoRedo&lt;/span&gt; objectContextUndoRedo;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _objectContextUndoRedo.TryGetValue(context, &lt;span style="color:blue;"&gt;out&lt;/span&gt; objectContextUndoRedo);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (objectContextUndoRedo == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;throw&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;InvalidOperationException&lt;/span&gt;();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; objectContextUndoRedo.Undo();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; CanRedo(&lt;span style="color:blue;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ObjectContext&lt;/span&gt; context)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;ObjectContextUndoRedo&lt;/span&gt; objectContextUndoRedo;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _objectContextUndoRedo.TryGetValue(context, &lt;span style="color:blue;"&gt;out&lt;/span&gt; objectContextUndoRedo);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (objectContextUndoRedo == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;throw&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;InvalidOperationException&lt;/span&gt;();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; objectContextUndoRedo.CanRedo;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Redo(&lt;span style="color:blue;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ObjectContext&lt;/span&gt; context)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;ObjectContextUndoRedo&lt;/span&gt; objectContextUndoRedo;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _objectContextUndoRedo.TryGetValue(context, &lt;span style="color:blue;"&gt;out&lt;/span&gt; objectContextUndoRedo);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (objectContextUndoRedo == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;throw&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;InvalidOperationException&lt;/span&gt;();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; objectContextUndoRedo.Redo();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; BeginGroupOfUndoActions(&lt;span style="color:blue;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ObjectContext&lt;/span&gt; context)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;ObjectContextUndoRedo&lt;/span&gt; objectContextUndoRedo;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _objectContextUndoRedo.TryGetValue(context, &lt;span style="color:blue;"&gt;out&lt;/span&gt; objectContextUndoRedo);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (objectContextUndoRedo == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;throw&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;InvalidOperationException&lt;/span&gt;();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; objectContextUndoRedo.MultipleActions = &lt;span style="color:blue;"&gt;true&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; EndGroupOfUndoActions(&lt;span style="color:blue;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ObjectContext&lt;/span&gt; context)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;ObjectContextUndoRedo&lt;/span&gt; objectContextUndoRedo;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _objectContextUndoRedo.TryGetValue(context, &lt;span style="color:blue;"&gt;out&lt;/span&gt; objectContextUndoRedo);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (objectContextUndoRedo == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;throw&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;InvalidOperationException&lt;/span&gt;();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; objectContextUndoRedo.MultipleActions = &lt;span style="color:blue;"&gt;false&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ObjectContextUndoRedo&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;UndoRedoAction&lt;/span&gt;&amp;gt;&amp;gt; _undo, _redo;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; _undoStackLength;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; _trackChanges;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ObjectContext&lt;/span&gt; Context { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; _multipleActions;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; MultipleActions &lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; _multipleActions; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;set&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _multipleActions = &lt;span style="color:blue;"&gt;value&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (&lt;span style="color:blue;"&gt;value&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _undo.Insert(0, &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;UndoRedoAction&lt;/span&gt;&amp;gt;());&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; ActivateUndoRedoTracking(&lt;span style="color:blue;"&gt;int&lt;/span&gt; undoStackLength)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _undoStackLength = undoStackLength;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _undo = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;UndoRedoAction&lt;/span&gt;&amp;gt;&amp;gt;(undoStackLength);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _redo = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;UndoRedoAction&lt;/span&gt;&amp;gt;&amp;gt;(undoStackLength);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _trackChanges = &lt;span style="color:blue;"&gt;true&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;var&lt;/span&gt; objectStateEntries = Context.ObjectStateManager.GetObjectStateEntries(&lt;span style="color:#2b91af;"&gt;EntityState&lt;/span&gt;.Added | &lt;span style="color:#2b91af;"&gt;EntityState&lt;/span&gt;.Deleted | &lt;span style="color:#2b91af;"&gt;EntityState&lt;/span&gt;.Modified | &lt;span style="color:#2b91af;"&gt;EntityState&lt;/span&gt;.Unchanged).ToList();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;PropertyChangingEventHandler&lt;/span&gt; entityModifing = &lt;span style="color:blue;"&gt;null&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; entityModifing = (sender, e) =&amp;gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;var&lt;/span&gt; propInfo = sender.GetType().GetProperty(e.PropertyName, &lt;span style="color:#2b91af;"&gt;BindingFlags&lt;/span&gt;.Instance | &lt;span style="color:#2b91af;"&gt;BindingFlags&lt;/span&gt;.Public | &lt;span style="color:#2b91af;"&gt;BindingFlags&lt;/span&gt;.NonPublic);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;var&lt;/span&gt; value = propInfo.GetValue(sender, &lt;span style="color:blue;"&gt;null&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;var&lt;/span&gt; undoRedoAction = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;UndoRedoAction&lt;/span&gt; { EntityState = &lt;span style="color:#2b91af;"&gt;EntityState&lt;/span&gt;.Modified, UndoAction = () =&amp;gt; propInfo.SetValue(sender, value, &lt;span style="color:blue;"&gt;null&lt;/span&gt;) };&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;var&lt;/span&gt; inpc = sender &lt;span style="color:blue;"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;INotifyPropertyChanged&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (inpc != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;PropertyChangedEventHandler&lt;/span&gt; entityModified = &lt;span style="color:blue;"&gt;null&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; entityModified = (s, e2) =&amp;gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (e.PropertyName == e2.PropertyName &amp;amp;&amp;amp; _trackChanges)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;var&lt;/span&gt; newValue = propInfo.GetValue(sender, &lt;span style="color:blue;"&gt;null&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; undoRedoAction.RedoAction = () =&amp;gt; propInfo.SetValue(sender, newValue, &lt;span style="color:blue;"&gt;null&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (MultipleActions)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _undo[0].Add(undoRedoAction);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;else&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _undo.Insert(0, &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;UndoRedoAction&lt;/span&gt;&amp;gt;() { undoRedoAction });&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (_undo.Count &amp;gt; _undoStackLength)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _undo.RemoveAt(_undoStackLength);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _redo.Clear();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; inpc.PropertyChanged -= entityModified;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; inpc.PropertyChanged += entityModified;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; e &lt;span style="color:blue;"&gt;in&lt;/span&gt; objectStateEntries.Select(ose =&amp;gt; ose.Entity &lt;span style="color:blue;"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;INotifyPropertyChanging&lt;/span&gt;).Where(inpc =&amp;gt; inpc != &lt;span style="color:blue;"&gt;null&lt;/span&gt;))&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.PropertyChanging += entityModifing;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Context.ObjectStateManager.ObjectStateManagerChanged += (sender, e) =&amp;gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;switch&lt;/span&gt; (e.Action)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;case&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CollectionChangeAction&lt;/span&gt;.Add:&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;var&lt;/span&gt; inpc = e.Element &lt;span style="color:blue;"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;INotifyPropertyChanging&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (inpc != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; inpc.PropertyChanging += entityModifing;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;break&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; CanUndo&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; _undo != &lt;span style="color:blue;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; _undo.Any(); }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Undo()&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (!CanUndo)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;throw&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;InvalidOperationException&lt;/span&gt;();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;var&lt;/span&gt; undoRedoAction = _undo.First();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _undo.RemoveAt(0);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _trackChanges = &lt;span style="color:blue;"&gt;false&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; undoAction &lt;span style="color:blue;"&gt;in&lt;/span&gt; undoRedoAction)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; undoAction.UndoAction();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _trackChanges = &lt;span style="color:blue;"&gt;true&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _redo.Insert(0, undoRedoAction);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; CanRedo&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; _redo != &lt;span style="color:blue;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; _redo.Any(); }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Redo()&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (!CanRedo)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;throw&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;InvalidOperationException&lt;/span&gt;();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;var&lt;/span&gt; undoRedoAction = _redo.First();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _redo.RemoveAt(0);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _trackChanges = &lt;span style="color:blue;"&gt;false&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; redoAction &lt;span style="color:blue;"&gt;in&lt;/span&gt; undoRedoAction)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; redoAction.RedoAction();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _trackChanges = &lt;span style="color:blue;"&gt;true&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _undo.Insert(0, undoRedoAction);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;UndoRedoAction&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EntityState&lt;/span&gt; EntityState { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt; UndoAction { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt; RedoAction { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;And to make a demo about it, I did an unit test: &lt;/p&gt;
&lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;
&lt;p style="margin:0px;"&gt;[&lt;span style="color:#2b91af;"&gt;TestClass&lt;/span&gt;]&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ObjectContextExtensionTest&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;{&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color:#2b91af;"&gt;TestMethod&lt;/span&gt;]&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Test()&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;using&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; context = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;NorthwindEntities&lt;/span&gt;())&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;var&lt;/span&gt; c = context.Categories.First();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.ActivateUndoRedoTracking(5);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;var&lt;/span&gt; cOriginalCategoryName = c.CategoryName;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c.CategoryName = &lt;span style="color:#a31515;"&gt;&amp;quot;CN&amp;quot;&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;var&lt;/span&gt; c2 = context.Categories.OrderBy(c3 =&amp;gt; c3.CategoryID).Skip(1).First();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;var&lt;/span&gt; c2OriginalCategoryName = c2.CategoryName;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c2.CategoryName = &lt;span style="color:#a31515;"&gt;&amp;quot;C2N&amp;quot;&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c.CategoryName = &lt;span style="color:#a31515;"&gt;&amp;quot;CN2&amp;quot;&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.Undo();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:#a31515;"&gt;&amp;quot;CN&amp;quot;&lt;/span&gt;, c.CategoryName);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:#a31515;"&gt;&amp;quot;C2N&amp;quot;&lt;/span&gt;, c2.CategoryName);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.Undo();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:#a31515;"&gt;&amp;quot;CN&amp;quot;&lt;/span&gt;, c.CategoryName);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(c2OriginalCategoryName, c2.CategoryName);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.Undo();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(cOriginalCategoryName, c.CategoryName);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(c2OriginalCategoryName, c2.CategoryName);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.Redo();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:#a31515;"&gt;&amp;quot;CN&amp;quot;&lt;/span&gt;, c.CategoryName);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(c2OriginalCategoryName, c2.CategoryName);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.Redo();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:#a31515;"&gt;&amp;quot;CN&amp;quot;&lt;/span&gt;, c.CategoryName);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:#a31515;"&gt;&amp;quot;C2N&amp;quot;&lt;/span&gt;, c2.CategoryName);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.Redo();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:#a31515;"&gt;&amp;quot;CN2&amp;quot;&lt;/span&gt;, c.CategoryName);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:#a31515;"&gt;&amp;quot;C2N&amp;quot;&lt;/span&gt;, c2.CategoryName);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.BeginGroupOfUndoActions();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c.CategoryName = &lt;span style="color:#a31515;"&gt;&amp;quot;CN3&amp;quot;&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c2.CategoryName = &lt;span style="color:#a31515;"&gt;&amp;quot;C2N2&amp;quot;&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.BeginGroupOfUndoActions();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c.CategoryName = &lt;span style="color:#a31515;"&gt;&amp;quot;CN4&amp;quot;&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c2.CategoryName = &lt;span style="color:#a31515;"&gt;&amp;quot;C2N3&amp;quot;&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.EndGroupOfUndoActions();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c.CategoryName = &lt;span style="color:#a31515;"&gt;&amp;quot;CN5&amp;quot;&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c2.CategoryName = &lt;span style="color:#a31515;"&gt;&amp;quot;C2N4&amp;quot;&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.Undo();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:#a31515;"&gt;&amp;quot;CN5&amp;quot;&lt;/span&gt;, c.CategoryName);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:#a31515;"&gt;&amp;quot;C2N3&amp;quot;&lt;/span&gt;, c2.CategoryName);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.Undo();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:#a31515;"&gt;&amp;quot;CN4&amp;quot;&lt;/span&gt;, c.CategoryName);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:#a31515;"&gt;&amp;quot;C2N3&amp;quot;&lt;/span&gt;, c2.CategoryName);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.Undo();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:#a31515;"&gt;&amp;quot;CN3&amp;quot;&lt;/span&gt;, c.CategoryName);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:#a31515;"&gt;&amp;quot;C2N2&amp;quot;&lt;/span&gt;, c2.CategoryName);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.Undo();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:#a31515;"&gt;&amp;quot;CN2&amp;quot;&lt;/span&gt;, c.CategoryName);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:#a31515;"&gt;&amp;quot;C2N&amp;quot;&lt;/span&gt;, c2.CategoryName);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.Redo();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:#a31515;"&gt;&amp;quot;CN3&amp;quot;&lt;/span&gt;, c.CategoryName);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:#a31515;"&gt;&amp;quot;C2N2&amp;quot;&lt;/span&gt;, c2.CategoryName);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.Redo();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:#a31515;"&gt;&amp;quot;CN4&amp;quot;&lt;/span&gt;, c.CategoryName);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:#a31515;"&gt;&amp;quot;C2N3&amp;quot;&lt;/span&gt;, c2.CategoryName);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.Redo();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:#a31515;"&gt;&amp;quot;CN5&amp;quot;&lt;/span&gt;, c.CategoryName);&lt;/p&gt;
&lt;p s