<?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 : WCF</title><link>http://msmvps.com/blogs/matthieu/archive/tags/WCF/default.aspx</link><description>Tags: WCF</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><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 with WCF recent demos</title><link>http://msmvps.com/blogs/matthieu/archive/2009/05/15/ef-with-wcf-demo.aspx</link><pubDate>Fri, 15 May 2009 22:42:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1692498</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=1692498</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/commentapi.aspx?PostID=1692498</wfw:comment><comments>http://msmvps.com/blogs/matthieu/archive/2009/05/15/ef-with-wcf-demo.aspx#comments</comments><description>&lt;p&gt;&lt;a target="_blank" href="http://msmvps.com/blogs/matthieu/archive/2009/04/28/french-alt-net-demo.aspx"&gt;I recently made a demo&amp;nbsp;of WCF and EF with POCO for French ALT .NET event&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://code.msdn.microsoft.com/dtl401sample/"&gt;Danny&amp;nbsp;made a great demo for Tech Ed&amp;nbsp;with EF, T4 generation template, WCF and ASP.NET MVC.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/matthieu.Demo/1588.EFWCFWithBLL.zip"&gt;I now post a new&amp;nbsp;EF and WCF&amp;nbsp;demo that I&amp;nbsp;made this week with&amp;nbsp;DAL EF&amp;nbsp;entities and BLL Entities.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;EF4 will improve the use of EF with WCF but it isn&amp;#39;t really&amp;nbsp;a problem&amp;nbsp;to&amp;nbsp;use these two technologies together with&amp;nbsp;EF v1.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1692498" width="1" height="1"&gt;</description><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/WCF/default.aspx">WCF</category></item><item><title>French ALT .NET Demo</title><link>http://msmvps.com/blogs/matthieu/archive/2009/04/28/french-alt-net-demo.aspx</link><pubDate>Tue, 28 Apr 2009 21:13:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1691490</guid><dc:creator>Matthieu MEZIL</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/rsscomments.aspx?PostID=1691490</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/matthieu/commentapi.aspx?PostID=1691490</wfw:comment><comments>http://msmvps.com/blogs/matthieu/archive/2009/04/28/french-alt-net-demo.aspx#comments</comments><description>&lt;p&gt;Last week, I spoke at&amp;nbsp;an&amp;nbsp;EF session for&amp;nbsp;the french ALT .NET community.&lt;/p&gt;
&lt;p&gt;During its course, I made a &lt;a target="_blank" href="http://msmvps.com/controlpanel/blogs/files.aspx?app=matthieu&amp;amp;folder=ALTNET"&gt;WCF demo with EF POCO and a sort of LINQ provider in the client part&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This provider is very simplistic (made in less than 15 minutes), isn&amp;#39;t thread safe but is interesting for the POC and because if my provider doesn&amp;#39;t support a LINQ method, it will use LINQ To Object method.&lt;/p&gt;
&lt;p&gt;I just want&amp;nbsp;to come back on this provider,&amp;nbsp;which is very different than normal LINQ providers, and particularly on this 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;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CategoryClient&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:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyQueryable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Category&lt;/span&gt;&amp;gt; Categories&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:#0000ff;"&gt;get&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; &lt;span style="color:#2b91af;"&gt;ClientLINQ&lt;/span&gt;.AllEntities = &lt;span style="color:#0000ff;"&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; &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; GetCategories().ToMyQueryable();&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:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Category&lt;/span&gt;&amp;gt; GetCategories()&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;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Category&lt;/span&gt;&amp;gt; value;&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:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;ClientLINQ&lt;/span&gt;.AllEntities)&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; value = &lt;span style="color:#2b91af;"&gt;Context&lt;/span&gt;.Instance.CategoryContract.GetAllCategories();&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:#0000ff;"&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; value = &lt;span style="color:#2b91af;"&gt;Context&lt;/span&gt;.Instance.CategoryContract.GetCategories(&lt;span style="color:#2b91af;"&gt;ClientLINQ&lt;/span&gt;.IncludeValues, &lt;span style="color:#2b91af;"&gt;ClientLINQ&lt;/span&gt;.WhereValue, &lt;span style="color:#2b91af;"&gt;ClientLINQ&lt;/span&gt;.OrderByValue, &lt;span style="color:#2b91af;"&gt;ClientLINQ&lt;/span&gt;.SkipValue, &lt;span style="color:#2b91af;"&gt;ClientLINQ&lt;/span&gt;.TakeValue);&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:#0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; category &lt;span style="color:#0000ff;"&gt;in&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;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;yield&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; category;&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;How does it work?&amp;nbsp;The set&amp;nbsp;of AllEntities&amp;nbsp;to true&amp;nbsp;initializes IncludeValues, WhereValues, etc&lt;/p&gt;
&lt;div style="font-family:Courier New;background:white;color:black;font-size:10pt;"&gt;
&lt;p style="margin:0px;"&gt;IncludeValues = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;WhereValue = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;OrderByValue = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;SkipValue = 0;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;TakeValue = 0;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;How can AllEntities&amp;nbsp;be false in&amp;nbsp;GetCategories method&amp;nbsp;whereas the instruction&amp;nbsp;which follows&amp;nbsp;AllEntities&amp;nbsp;= true&amp;nbsp;is the GetCategories call&amp;nbsp;and this method&amp;nbsp;starts with a test on&amp;nbsp;AllEntities ?&lt;/p&gt;
&lt;p&gt;In fact, you should see that&amp;nbsp;this method uses&amp;nbsp;yield return syntax. So,&amp;nbsp;it will be run&amp;nbsp;only when&amp;nbsp;Categories properties&amp;nbsp;will be iterated.&amp;nbsp;This means&amp;nbsp;that the different LINQ&amp;nbsp;methods are called before. That&amp;#39;s why it&amp;#39;s works.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1691490" 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/LINQ+To+Object/default.aspx">LINQ To Object</category><category domain="http://msmvps.com/blogs/matthieu/archive/tags/WCF/default.aspx">WCF</category></item></channel></rss>