<?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>Paulo Morgado : LINQ</title><link>http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx</link><description>Tags: LINQ</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>LINQ To SQL Tips &amp; Tricks: String Operations</title><link>http://msmvps.com/blogs/paulomorgado/archive/2009/10/13/linq-to-sql-tips-amp-tricks-string-operations.aspx</link><pubDate>Tue, 13 Oct 2009 00:51:43 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1732069</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1732069</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1732069</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2009/10/13/linq-to-sql-tips-amp-tricks-string-operations.aspx#comments</comments><description>&lt;a title="LINQ With C# (Portuguese)" href="http://bit.ly/Livro-LINQ-Com-Charp" target="_blank"&gt;&lt;img style="border-right-width:0px;margin:0px 0px 10px 10px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="LINQ With C# (Portuguese)" border="0" alt="LINQ With C# (Portuguese)" align="right" src="http://www.fca.pt/ximages/722_547.gif" width="99" height="140" /&gt;&lt;/a&gt;   &lt;p align="justify"&gt;&lt;a title="Language-Integrated Query (LINQ)" href="http://msdn.microsoft.com/library/bb397926.aspx" target="_blank"&gt;LINQ&lt;/a&gt; brought developers a very user friendly and domain independent style of writing queries.&lt;/p&gt;  &lt;p align="justify"&gt;The fact that the way queries are written is domain independent doesn’t mean that any query will compile the same way or even run the same way. You’ll always need to know how the provider will behave.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a title="LINQ to Objects" href="http://msdn.microsoft.com/library/bb397919.aspx" target="_blank"&gt;LINQ To Objects&lt;/a&gt;, for example, will compile queries as a &lt;strong&gt;Func&amp;lt;&amp;gt;&lt;/strong&gt; delegate and the query methods will return &lt;a title="IEnumerable(T) Interface" href="http://msdn.microsoft.com/library/9eekhta0.aspx" target="_blank"&gt;IEnumerable(T)&lt;/a&gt; implementations.&lt;/p&gt;  &lt;p align="justify"&gt;On the other hand, &lt;a title="LINQ To SQL" href="http://msdn.microsoft.com/library/bb386976.aspx" target="_blank"&gt;LINQ To SQL&lt;/a&gt; will compile queries as an &lt;strong&gt;Expression&amp;lt;Func&amp;lt;&amp;gt;&amp;gt;&lt;/strong&gt; (which is, in fact, an expression tree) instance and the query methods will return &lt;a title="IQueryable(T) Interface" href="http://msdn.microsoft.com/library/bb351562.aspx" target="_blank"&gt;IQueryable(T)&lt;/a&gt; implementations.&lt;/p&gt;  &lt;p align="justify"&gt;Because LINQ To SQL queries are compiled to an expression tree, that allows the provider to treat the query elements as it sees fit.&lt;/p&gt;  &lt;p align="justify"&gt;In this case, this means that all operations that can be done on the database will be done on the database and the developer must be aware of this when she/he is writing the queries.&lt;/p&gt;  &lt;p align="justify"&gt;Lets take an example using the &lt;strong&gt;AdventureWorks&lt;/strong&gt; database (if you don’t have it, you can download it from &lt;a title="Microsoft SQL Server Product Samples: Database" href="http://msftdbprodsamples.codeplex.com/" target="_blank"&gt;here&lt;/a&gt;).&lt;/p&gt;  &lt;p align="justify"&gt;I want to build a list of salutation for every employee that has the &lt;strong&gt;SalariedFlag&lt;/strong&gt; set, in the form of:&lt;/p&gt;  &lt;p style="padding-left:1em;" align="justify"&gt;[Mr.|Mrs.|Miss] &amp;lt;first name&amp;gt; &amp;lt;middle name&amp;gt; &amp;lt;last name&amp;gt;&lt;/p&gt;  &lt;p align="justify"&gt;But there’s also one detail about the data in the database: FirstName, MiddleName and LastName may have trailing spaces and I don’t want them.&lt;/p&gt;  &lt;p align="justify"&gt;This is a simple query like this:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;q1 = &lt;span style="color:blue;"&gt;from &lt;/span&gt;e &lt;span style="color:blue;"&gt;in &lt;/span&gt;context.Employees
         &lt;span style="color:blue;"&gt;where &lt;/span&gt;e.SalariedFlag
         &lt;span style="color:blue;"&gt;select
            &lt;/span&gt;((e.Gender == &lt;span style="color:#a31515;"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;) ? ((e.MaritalStatus == &lt;span style="color:#a31515;"&gt;&amp;#39;S&amp;#39;&lt;/span&gt;) ? &lt;span style="color:#a31515;"&gt;&amp;quot;Miss&amp;quot; &lt;/span&gt;: &lt;span style="color:#a31515;"&gt;&amp;quot;Mrs.&amp;quot;&lt;/span&gt;) : &lt;span style="color:#a31515;"&gt;&amp;quot;Mr.&amp;quot;&lt;/span&gt;) + &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;+
            e.Person.FirstName.Trim() +
            (e.Person.MiddleName == &lt;span style="color:blue;"&gt;null &lt;/span&gt;|| e.Person.MiddleName.Trim().Length == 0 ? &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;: &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;+ e.Person.MiddleName.Trim() + &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot;&lt;/span&gt;) +
            e.Person.LastName.Trim();&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;and it will be executed as:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;SELECT &lt;/span&gt;&lt;span style="color:gray;"&gt;((((
    (&lt;/span&gt;&lt;span style="color:blue;"&gt;CASE
        WHEN &lt;/span&gt;&lt;span style="color:magenta;"&gt;UNICODE&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Gender]&lt;span style="color:gray;"&gt;) = &lt;/span&gt;@p0 &lt;span style="color:blue;"&gt;THEN
            &lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:blue;"&gt;CASE
                WHEN &lt;/span&gt;&lt;span style="color:magenta;"&gt;UNICODE&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MaritalStatus]&lt;span style="color:gray;"&gt;) = &lt;/span&gt;@p1 &lt;span style="color:blue;"&gt;THEN &lt;/span&gt;@p2
                &lt;span style="color:blue;"&gt;ELSE &lt;/span&gt;@p3
             &lt;span style="color:blue;"&gt;END&lt;/span&gt;&lt;span style="color:gray;"&gt;)
        &lt;/span&gt;&lt;span style="color:blue;"&gt;ELSE &lt;/span&gt;&lt;span style="color:magenta;"&gt;CONVERT&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:blue;"&gt;NVarChar&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;4&lt;span style="color:gray;"&gt;),&lt;/span&gt;@p4&lt;span style="color:gray;"&gt;)
     &lt;/span&gt;&lt;span style="color:blue;"&gt;END&lt;/span&gt;&lt;span style="color:gray;"&gt;)) + &lt;/span&gt;@p5&lt;span style="color:gray;"&gt;) + &lt;/span&gt;&lt;span style="color:magenta;"&gt;LTRIM&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:magenta;"&gt;RTRIM&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[FirstName]&lt;span style="color:gray;"&gt;))) + (
    (&lt;/span&gt;&lt;span style="color:blue;"&gt;CASE
        WHEN &lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MiddleName] &lt;span style="color:gray;"&gt;IS NULL) OR (&lt;/span&gt;&lt;span style="color:magenta;"&gt;LEN&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:magenta;"&gt;LTRIM&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:magenta;"&gt;RTRIM&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MiddleName]&lt;span style="color:gray;"&gt;))) = &lt;/span&gt;@p6&lt;span style="color:gray;"&gt;) &lt;/span&gt;&lt;span style="color:blue;"&gt;THEN &lt;/span&gt;&lt;span style="color:magenta;"&gt;CONVERT&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:blue;"&gt;NVarChar&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:magenta;"&gt;MAX&lt;/span&gt;&lt;span style="color:gray;"&gt;),&lt;/span&gt;@p7&lt;span style="color:gray;"&gt;)
        &lt;/span&gt;&lt;span style="color:blue;"&gt;ELSE &lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;@p8 &lt;span style="color:gray;"&gt;+ &lt;/span&gt;&lt;span style="color:magenta;"&gt;LTRIM&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:magenta;"&gt;RTRIM&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MiddleName]&lt;span style="color:gray;"&gt;))) + &lt;/span&gt;@p9
     &lt;span style="color:blue;"&gt;END&lt;/span&gt;&lt;span style="color:gray;"&gt;))) + &lt;/span&gt;&lt;span style="color:magenta;"&gt;LTRIM&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:magenta;"&gt;RTRIM&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[LastName]&lt;span style="color:gray;"&gt;)) &lt;/span&gt;&lt;span style="color:blue;"&gt;AS &lt;/span&gt;[value]
&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;[HumanResources]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Employee] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[t0]
&lt;span style="color:gray;"&gt;INNER JOIN &lt;/span&gt;[Person]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Person] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[t1] &lt;span style="color:blue;"&gt;ON &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID] &lt;span style="color:gray;"&gt;= &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID]
&lt;span style="color:blue;"&gt;WHERE &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[SalariedFlag] &lt;span style="color:gray;"&gt;= &lt;/span&gt;1
&lt;span style="color:green;"&gt;-- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [70]
-- @p1: Input Int (Size = 0; Prec = 0; Scale = 0) [83]
-- @p2: Input NVarChar (Size = 4; Prec = 0; Scale = 0) [Miss]
-- @p3: Input NVarChar (Size = 4; Prec = 0; Scale = 0) [Mrs.]
-- @p4: Input NVarChar (Size = 3; Prec = 0; Scale = 0) [Mr.]
-- @p5: Input NVarChar (Size = 1; Prec = 0; Scale = 0) [ ]
-- @p6: Input Int (Size = 0; Prec = 0; Scale = 0) [0]
-- @p7: Input NVarChar (Size = 1; Prec = 0; Scale = 0) [ ]
-- @p8: Input NVarChar (Size = 1; Prec = 0; Scale = 0) [ ]
-- @p9: Input NVarChar (Size = 1; Prec = 0; Scale = 0) [ ]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.4926&lt;/span&gt;&lt;/pre&gt;

&lt;p align="justify"&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;If you notice the query, there are a lot of text operations going on for each row.&lt;/p&gt;

&lt;p align="justify"&gt;Depending on the number of rows or database load this can prove to be very bad. The result might even be just a timeout.&lt;/p&gt;

&lt;p align="justify"&gt;So, how do we force the string operations to occur on the client instead of the database?&lt;/p&gt;

&lt;p align="justify"&gt;Only &lt;strong&gt;IQueryable&amp;lt;T&amp;gt;&lt;/strong&gt; will be translated to T-SQL. So, all we need to do is change the type of the enumerator being iterated.&lt;/p&gt;

&lt;p align="justify"&gt;One way to do this is using the the &lt;a title="Enumerable.AsEnumerable(TSource) Method" href="http://msdn.microsoft.com/library/bb335435.aspx" target="_blank"&gt;AsEnumerable&lt;/a&gt; method of the &lt;a title="Enumerable Class" href="http://msdn.microsoft.com/library/system.linq.enumerable.aspx" target="_blank"&gt;Enumerable&lt;/a&gt; class.&lt;/p&gt;

&lt;p align="justify"&gt;The query would now be written as:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;q2 = &lt;span style="color:blue;"&gt;from &lt;/span&gt;e &lt;span style="color:blue;"&gt;in &lt;/span&gt;context.Employees.Where(e =&amp;gt; e.SalariedFlag).AsEnumerable()
         &lt;span style="color:blue;"&gt;select
            &lt;/span&gt;((e.Gender == &lt;span style="color:#a31515;"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;) ? ((e.MaritalStatus == &lt;span style="color:#a31515;"&gt;&amp;#39;S&amp;#39;&lt;/span&gt;) ? &lt;span style="color:#a31515;"&gt;&amp;quot;Miss&amp;quot; &lt;/span&gt;: &lt;span style="color:#a31515;"&gt;&amp;quot;Mrs.&amp;quot;&lt;/span&gt;) : &lt;span style="color:#a31515;"&gt;&amp;quot;Mr.&amp;quot;&lt;/span&gt;) + &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;+ e.Person.FirstName.Trim() +
            (e.Person.MiddleName == &lt;span style="color:blue;"&gt;null &lt;/span&gt;|| e.Person.MiddleName.Trim().Length == 0 ? &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;: &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;+ e.Person.MiddleName.Trim() + &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot;&lt;/span&gt;) +
            e.Person.LastName.Trim();&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;and it will be executed as:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;SELECT
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[LoginID]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[NationalIDNumber]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[JobTitle]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MaritalStatus]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BirthDate]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Gender]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[HireDate]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[SalariedFlag]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[VacationHours]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[SickLeaveHours]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[CurrentFlag]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[rowguid]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ModifiedDate]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[BusinessEntityID2]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[PersonType]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[NameStyle]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Title]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[FirstName]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MiddleName]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[LastName]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Suffix]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[EmailPromotion]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[AdditionalContactInfo]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Demographics]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[rowguid] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[rowguid2]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ModifiedDate] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[ModifiedDate2]
&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;[HumanResources]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Employee] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[t0]
&lt;span style="color:gray;"&gt;INNER JOIN &lt;/span&gt;[Person]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Person] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[t1] &lt;span style="color:blue;"&gt;ON &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID] &lt;span style="color:gray;"&gt;= &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID]
&lt;span style="color:blue;"&gt;WHERE &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[SalariedFlag] &lt;span style="color:gray;"&gt;= &lt;/span&gt;1
&lt;span style="color:green;"&gt;-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.4926&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;As you can notice, text operations are no longer done on the database, but all the columns of both tables are being returned. And this is still a bad thing because we are using network bandwidth with data that won’t be used.&lt;/p&gt;

&lt;p align="justify"&gt;The way to choose the columns that will be retrieved from the database is by selecting only the ones wanted in the select statement. But because we still want string operations the be done on the client, we’ll need to project the desired columns into an intermediary object. Since we won’t need this object outside the query, we’ll use an &lt;a title="Anonymous Types" href="http://msdn.microsoft.com/library/bb397696.aspx" target="_blank"&gt;anonymous type&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The query would now be written as:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;q3 = &lt;span style="color:blue;"&gt;from &lt;/span&gt;n &lt;span style="color:blue;"&gt;in
             &lt;/span&gt;(
                 &lt;span style="color:blue;"&gt;from &lt;/span&gt;e &lt;span style="color:blue;"&gt;in &lt;/span&gt;context.Employees
                 &lt;span style="color:blue;"&gt;where &lt;/span&gt;e.SalariedFlag
                 &lt;span style="color:blue;"&gt;select new
                 &lt;/span&gt;{
                     Gender = e.Gender,
                     MaritalStatus = e.MaritalStatus,
                     FirstName = e.Person.FirstName,
                     MiddleName = e.Person.MiddleName,
                     LastName = e.Person.LastName
                 }
             ).AsEnumerable()
         &lt;span style="color:blue;"&gt;select &lt;/span&gt;((n.Gender == &lt;span style="color:#a31515;"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;) ? ((n.MaritalStatus == &lt;span style="color:#a31515;"&gt;&amp;#39;S&amp;#39;&lt;/span&gt;) ? &lt;span style="color:#a31515;"&gt;&amp;quot;Miss&amp;quot; &lt;/span&gt;: &lt;span style="color:#a31515;"&gt;&amp;quot;Mrs.&amp;quot;&lt;/span&gt;) : &lt;span style="color:#a31515;"&gt;&amp;quot;Mr.&amp;quot;&lt;/span&gt;) + &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;+ n.FirstName.Trim()
         + (n.MiddleName == &lt;span style="color:blue;"&gt;null &lt;/span&gt;|| n.MiddleName.Trim().Length == 0 ? &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;: &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;+ n.MiddleName.Trim() + &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot;&lt;/span&gt;)
         + n.LastName.Trim();&lt;/pre&gt;

&lt;p&gt;and it will be executed as:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;SELECT
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Gender]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MaritalStatus]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[FirstName]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MiddleName]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[LastName]
&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;[HumanResources]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Employee] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[t0]
&lt;span style="color:gray;"&gt;INNER JOIN &lt;/span&gt;[Person]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Person] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[t1] &lt;span style="color:blue;"&gt;ON &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID] &lt;span style="color:gray;"&gt;= &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID]
&lt;span style="color:blue;"&gt;WHERE &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[SalariedFlag] &lt;span style="color:gray;"&gt;= &lt;/span&gt;1
&lt;span style="color:green;"&gt;-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.4926&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Notice the call to Enumerable.As Enumerable to translate the LINQ To SQL query into a LINQ To Objects query.&lt;/p&gt;

&lt;p&gt;And, to end this long blog post, if you don’t use any string operations on the query, they, obviously, won’t be translated to T-SQL:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;q4 = &lt;span style="color:blue;"&gt;from &lt;/span&gt;e &lt;span style="color:blue;"&gt;in &lt;/span&gt;context.Employees
         &lt;span style="color:blue;"&gt;where &lt;/span&gt;e.SalariedFlag
         &lt;span style="color:blue;"&gt;select &lt;/span&gt;BuildSalutation(e.Gender, e.MaritalStatus, e.Person.FirstName, e.Person.MiddleName, e.Person.LastName);&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;where &lt;strong&gt;BuildSalutation&lt;/strong&gt; is implemented as:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;private static object &lt;/span&gt;BuildSalutation(&lt;span style="color:blue;"&gt;char &lt;/span&gt;gender, &lt;span style="color:blue;"&gt;char &lt;/span&gt;maritalStatus, &lt;span style="color:blue;"&gt;string &lt;/span&gt;firstName, &lt;span style="color:blue;"&gt;string &lt;/span&gt;middleName, &lt;span style="color:blue;"&gt;string &lt;/span&gt;lastName)
{
    &lt;span style="color:blue;"&gt;return &lt;/span&gt;((gender == &lt;span style="color:#a31515;"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;) ? ((maritalStatus == &lt;span style="color:#a31515;"&gt;&amp;#39;S&amp;#39;&lt;/span&gt;) ? &lt;span style="color:#a31515;"&gt;&amp;quot;Miss&amp;quot; &lt;/span&gt;: &lt;span style="color:#a31515;"&gt;&amp;quot;Mrs.&amp;quot;&lt;/span&gt;) : &lt;span style="color:#a31515;"&gt;&amp;quot;Mr.&amp;quot;&lt;/span&gt;) + &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot;
        &lt;/span&gt;+ firstName.Trim()
        + (middleName == &lt;span style="color:blue;"&gt;null &lt;/span&gt;|| middleName.Trim().Length == 0 ? &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;: &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;+ middleName.Trim() + &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot;&lt;/span&gt;)
        + lastName.Trim();
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;and it will be executed as:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;SELECT
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Gender] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[gender]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MaritalStatus] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[maritalStatus]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[FirstName] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[firstName]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MiddleName] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[middleName]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[LastName] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[lastName]
&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;[HumanResources]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Employee] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[t0]
&lt;span style="color:gray;"&gt;INNER JOIN &lt;/span&gt;[Person]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Person] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[t1] &lt;span style="color:blue;"&gt;ON &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID] &lt;span style="color:gray;"&gt;= &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID]
&lt;span style="color:blue;"&gt;WHERE &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[SalariedFlag] &lt;span style="color:gray;"&gt;= &lt;/span&gt;1
&lt;span style="color:green;"&gt;-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.4926&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Have you noticed that this T-SQL query is pretty much the same in the previous example?&lt;/p&gt;

&lt;p&gt;If you are still reading this, I hope you now aware of how you write your LINQ To SQL queries affect the generated T-SQL.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1732069" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/TipsAndTricks/default.aspx">TipsAndTricks</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ2SQL/default.aspx">LINQ2SQL</category></item><item><title>Playing With SQL Server CLR Integration – Part III</title><link>http://msmvps.com/blogs/paulomorgado/archive/2009/06/12/playing-with-sql-server-clr-integration-part-iii.aspx</link><pubDate>Fri, 12 Jun 2009 00:11:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1695056</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1695056</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1695056</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2009/06/12/playing-with-sql-server-clr-integration-part-iii.aspx#comments</comments><description>&lt;p&gt;You might have noticed that I used &lt;a title="Language-Integrated Query (LINQ)" href="http://msdn2.microsoft.com/library/bb397926.aspx" target="_blank"&gt;LINQ&lt;/a&gt; in my last Playing With SQL Server CLR Integration posts (&lt;a title="Playing With SQL Server CLR Integration - Part I" href="http://cli.gs/gupt5m" target="_blank"&gt;Part I&lt;/a&gt;, &lt;a title="Playing With SQL Server CLR Integration - Part II" href="http://cli.gs/2gs6GD" target="_blank"&gt;Part II&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;I couldn’t make it work with the standard &lt;a title="Microsoft Visual Studio" href="http://cli.gs/vstudio" target="_blank"&gt;Visual Studio&lt;/a&gt; 2008 SQL CLR project template. Changing the &lt;strong&gt;Target Framework&lt;/strong&gt; to &lt;a title=".NET Framework" href="http://cli.gs/netframework" target="_blank"&gt;&lt;/a&gt;&lt;a title="Microsoft .NET" href="http://cli.gs/cligs/Microsoft-NET" target="_blank"&gt;.NET Framework&lt;/a&gt; 3.5&lt;/a&gt; wasn’t enough. I had to edit the &lt;strong&gt;.csproj&lt;/strong&gt; file by hand:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;p&gt;&lt;span style="color:blue;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a31515;"&gt;xml &lt;/span&gt;&lt;span style="color:red;"&gt;version&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;1.0&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;encoding&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;utf-8&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;?&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Project &lt;/span&gt;&lt;span style="color:red;"&gt;ToolsVersion&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;3.5&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;DefaultTargets&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Build&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;http://schemas.microsoft.com/developer/msbuild/2003&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;
&lt;span style="color:blue;"&gt;  &amp;lt;!—&lt;/span&gt;&lt;span style="color:green;"&gt; ... &lt;span style="color:blue;"&gt;--&lt;/span&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ItemGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;&lt;span style="color:blue;"&gt;!—&lt;/span&gt;&lt;span style="color:green;"&gt; ... &lt;span style="color:blue;"&gt;--&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&lt;strong&gt;    &amp;lt;&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="color:#a31515;"&gt;Reference &lt;/span&gt;&lt;span style="color:red;"&gt;Include&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;System.Core&lt;/span&gt;&amp;quot;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color:blue;"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;RequiredTargetFramework&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;3.5&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;RequiredTargetFramework&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Reference&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&lt;/span&gt;&lt;span style="color:blue;"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Reference &lt;/span&gt;&lt;span style="color:red;"&gt;Include&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;System.Xml.Linq&lt;/span&gt;&amp;quot;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color:blue;"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;RequiredTargetFramework&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;3.5&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;RequiredTargetFramework&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Reference&lt;/span&gt;&lt;/strong&gt;&lt;span style="color:blue;"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ItemGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&lt;/span&gt;&lt;span style="color:blue;"&gt;  &amp;lt;&lt;span style="color:blue;"&gt;!—&lt;/span&gt;&lt;span style="color:green;"&gt; ... &lt;span style="color:blue;"&gt;--&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Project&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1695056" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLServer/default.aspx">SQLServer</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLServer2008/default.aspx">SQLServer2008</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLServer2005/default.aspx">SQLServer2005</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLCLR/default.aspx">SQLCLR</category></item><item><title>LINQ With C# Book Is Finally Out</title><link>http://msmvps.com/blogs/paulomorgado/archive/2009/05/18/linq-with-c-book-is-finally-out.aspx</link><pubDate>Sun, 17 May 2009 23:39:51 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1692586</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1692586</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1692586</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2009/05/18/linq-with-c-book-is-finally-out.aspx#comments</comments><description>&lt;p align="justify"&gt;It’s finally out!&lt;/p&gt;  &lt;p align="justify"&gt;The &lt;strong&gt;&lt;a title="Livro LINQ Com C#" href="http://cli.gs/Livro-LINQ-Com-Charp" target="_blank"&gt;LINQ Com C#&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt; (LINQ With C#) book that &lt;a title="Luís Abreu" href="http://cli.gs/LuisAbreu" target="_blank"&gt;Luís&lt;/a&gt; and I wrote is out. Well, mostly Luís than I.&lt;/p&gt;  &lt;p align="justify"&gt;This book, published by &lt;a title="FCA- Livros de Informática / TI para todos os níveis" href="http://www.fca.pt/" target="_blank"&gt;FCA&lt;/a&gt;, is targeted at anyone that already knows &lt;a title="Microsoft Visual C#" href="http://cli.gs/vcsharp" target="_blank"&gt;C#&lt;/a&gt; 2.0 and wants to know learn the new features introduced with C# 3.0 that made possible &lt;a title="Language-Integrated Query (LINQ)" href="http://msdn2.microsoft.com/library/bb397926.aspx" target="_blank"&gt;LINQ&lt;/a&gt; (Language INtegrated Query). The examples in the book are written in C#, but &lt;a title="Visual Basic Developer Center" href="http://msdn.microsoft.com/vbasic/" target="_blank"&gt;Visual Basic&lt;/a&gt; get be get from the book’s site.&lt;/p&gt;  &lt;div&gt;   &lt;table&gt;       &lt;tr&gt;         &lt;td style="padding-right:10px;" rowspan="5"&gt;&lt;a title="Livro LINQ Com C#" href="http://cli.gs/Livro-LINQ-Com-Charp" target="_blank"&gt;&lt;img border="0" alt="Livro LINQ Com C#" src="http://www.fca.pt/ximages/722_547.gif" /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td style="text-align:right;padding-right:10px;"&gt;Title:&lt;/td&gt;          &lt;td&gt;&lt;strong&gt;&lt;a title="Livro LINQ Com C#" href="http://cli.gs/Livro-LINQ-Com-Charp" target="_blank"&gt;LINQ Com C#&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td style="text-align:right;padding-right:10px;"&gt;Authors:&lt;/td&gt;          &lt;td&gt;&lt;a title="Luís Abreu" href="http://cli.gs/LuisAbreu" target="_blank"&gt;Luís Abreu&lt;/a&gt; / &lt;a title="Paulo Morgado" href="http://paulomorgado.net/" target="_blank"&gt;Paulo Morgado&lt;/a&gt;&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td style="text-align:right;padding-right:10px;"&gt;ISBN:&lt;/td&gt;          &lt;td&gt;978-972-722-547-7&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td style="text-align:right;padding-right:10px;"&gt;Number of Pages:&lt;/td&gt;          &lt;td&gt;216&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td style="text-align:right;padding-right:10px;"&gt;Format:&lt;/td&gt;          &lt;td&gt;17,0 x 24,0 x 1,3 cm (6.7 x 9.4 x 0.5 in)&lt;/td&gt;       &lt;/tr&gt;     &lt;/table&gt; &lt;/div&gt;  &lt;p&gt;The book can be found here:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://cli.gs/Livro-LINQ-Com-Charp"&gt;FCA&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://cli.gs/LYJEVY"&gt;WOOK&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://cli.gs/8ApGrH"&gt;fnac&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1692586" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/VisualBasic/default.aspx">VisualBasic</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Books/default.aspx">Books</category></item><item><title>LINQ With C# Book</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/09/22/linq-with-c-book.aspx</link><pubDate>Sun, 21 Sep 2008 23:42:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1648475</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1648475</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1648475</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/09/22/linq-with-c-book.aspx#comments</comments><description>&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;&lt;a title="Luís Abreu" href="http://msmvps.com/blogs/luisabreu/" target="_blank"&gt;Luís&lt;/a&gt; just &lt;a title="Future projects: Portuguese C# book on LINQ" href="http://msmvps.com/blogs/luisabreu/archive/2008/09/21/future-projects-portuguese-c-book-on-linq.aspx" target="_blank"&gt;broke the news&lt;/a&gt; on our &lt;a title="Language-Integrated Query (LINQ)" href="http://msdn2.microsoft.com/library/bb397926.aspx" target="_blank"&gt;LINQ&lt;/a&gt; with &lt;a title="Visual C#" href="http://msdn.microsoft.com/vcsharp/" target="_blank"&gt;C#&lt;/a&gt; book.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;I was honored with the invitation from Luís to write this book with him for &lt;a title="FCA- Livros de Informática / TI para todos os níveis" href="http://www.fca.pt/" target="_blank"&gt;FCA&lt;/a&gt;, for which he has already published a few books [&lt;a title="ASP.NET 2.0 - Curso Completo" href="http://www.fca.pt/cgi-bin/fca_main.cgi/?op=2&amp;amp;isbn=972-722-503-9" target="_blank"&gt;^&lt;/a&gt;] [&lt;a title="Ajax com ASP.Net Curso Completo" href="http://www.fca.pt/cgi-bin/fca_main.cgi/?op=2&amp;amp;isbn=978-972-722-551-4" target="_blank"&gt;^&lt;/a&gt;] [&lt;a title="ASP.NET 3.5 - Curso Completo" href="http://www.fca.pt/cgi-bin/fca_main.cgi/?op=2&amp;amp;isbn=978-972-722-615-3" target="_blank"&gt;^&lt;/a&gt;] before. &lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;This will be an entry level book in Portuguese targeted to anyone wanting to learn LINQ with C#.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;It has been a fun project with great discussions (only possible because we have half an ocean between us :) ).&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1648475" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Books/default.aspx">Books</category></item><item><title>More On Another Way For Using The “using” Keyword</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/08/11/more-on-another-way-for-using-the-using-keyword.aspx</link><pubDate>Mon, 11 Aug 2008 00:47:50 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1644170</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1644170</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1644170</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/08/11/more-on-another-way-for-using-the-using-keyword.aspx#comments</comments><description>&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p&gt;In the &lt;a title="Yet Another Way for Using the &amp;quot;using&amp;quot; Keyword" href="http://msmvps.com/blogs/paulomorgado/archive/2007/03/25/yet-another-way-for-using-the-using-keyword.aspx" target="_blank"&gt;past&lt;/a&gt; I presented another possible use for the &lt;a title="using (C# Reference)" href="http://msdn2.microsoft.com/library/124e1a63-2a4b-4132-b269-3b6d8d3ef72d.aspx"&gt;using&lt;/a&gt; keyword: as hints on &lt;a title="Language-Integrated Query (LINQ)" href="http://msdn2.microsoft.com/library/bb397926.aspx" target="_blank"&gt;LINQ&lt;/a&gt;.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p&gt;I’ve been giving some thought about this lately and refined my proposal.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;pre&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt; q = &lt;font color="#0000ff"&gt;from&lt;/font&gt; person &lt;font color="#0000ff"&gt;in&lt;/font&gt; personCollection &lt;font color="#0000ff"&gt;using&lt;/font&gt; &lt;font color="#2b91af"&gt;MyEnumerableExtensions&lt;/font&gt;
        &lt;font color="#0000ff"&gt;group&lt;/font&gt; person &lt;font color="#0000ff"&gt;by&lt;/font&gt; person.LastName &lt;font color="#0000ff"&gt;into&lt;/font&gt; g &lt;font color="#0000ff"&gt;using new&lt;/font&gt; &lt;font color="#2b91af"&gt;MyOtherComparer&lt;/font&gt;()
        &lt;font color="#0000ff"&gt;orderby&lt;/font&gt; g.Key &lt;font color="#0000ff"&gt;using new&lt;/font&gt; &lt;font color="#2b91af"&gt;MyComparer&lt;/font&gt;()
        &lt;font color="#0000ff"&gt;select&lt;/font&gt; person;&lt;/pre&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p&gt;The above query would be converted to:&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;pre&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt; q = &lt;font color="#2b91af"&gt;MyEnumerableExtensions&lt;/font&gt;.OrderBy&amp;lt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;, &lt;font color="#2b91af"&gt;Person&lt;/font&gt;&amp;gt;(
    &lt;font color="#2b91af"&gt;MyEnumerableExtensions&lt;/font&gt;.GroupBy&amp;lt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;, &lt;font color="#2b91af"&gt;Person&lt;/font&gt;&amp;gt;(
        personCollection,
        person =&amp;gt; person.LastName,
        &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;MyComparer&lt;/font&gt;(),
    ),
    g =&amp;gt; g.Key,
    &lt;font color="#0000ff"&gt;mew&lt;/font&gt; &lt;font color="#2b91af"&gt;MyOtherComparer&lt;/font&gt;()
);&lt;/pre&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p&gt;What do you think of this?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1644170" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>C# And Visual Basic Generate Different Expression Trees</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/08/04/c-and-visual-basic-generate-different-expression-trees.aspx</link><pubDate>Mon, 04 Aug 2008 00:23:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1643213</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1643213</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1643213</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/08/04/c-and-visual-basic-generate-different-expression-trees.aspx#comments</comments><description>&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;(This was pointed out to me by &lt;a title="Frans Bouma&amp;#39;s blog" href="http://weblogs.asp.net/fbouma/" target="_blank"&gt;Frans Bouma&lt;/a&gt; and explained by &lt;a title="Jon Skeet&amp;#39;s Coding Blog" href="http://msmvps.com/blogs/jon.skeet/" target="_blank"&gt;Jon Skeet&lt;/a&gt;)&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;Imagine you have this set of classes:&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;public class &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;A
&lt;/span&gt;{
    &lt;span style="COLOR:blue;"&gt;public virtual string &lt;/span&gt;P
    {
        &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;A&amp;quot;&lt;/span&gt;; }
    }
}

&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;&lt;span style="COLOR:blue;"&gt;public class &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;B &lt;/span&gt;: &lt;span style="COLOR:#2b91af;"&gt;A
&lt;/span&gt;{
}

&lt;span style="COLOR:blue;"&gt;public class &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;C &lt;/span&gt;: &lt;span style="COLOR:#2b91af;"&gt;B
&lt;/span&gt;{
    &lt;span style="COLOR:blue;"&gt;public override string &lt;/span&gt;P
    {
        &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;C&amp;quot;&lt;/span&gt;; }
    }
}&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;And this class:&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;public static class &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Reporter
&lt;/span&gt;{
    &lt;span style="COLOR:blue;"&gt;public static void &lt;/span&gt;Report&amp;lt;T&amp;gt;(T target, &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;string&lt;/span&gt;&amp;gt;&amp;gt; expression)
    {
        &lt;span style="COLOR:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;Expression: {0}&amp;quot;&lt;/span&gt;, expression);
        &lt;span style="COLOR:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;\tDeclaring Type: {0}&amp;quot;&lt;/span&gt;, ((expression &lt;span style="COLOR:blue;"&gt;as &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;LambdaExpression&lt;/span&gt;).Body &lt;span style="COLOR:blue;"&gt;as &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;MemberExpression&lt;/span&gt;).Member.DeclaringType);
        &lt;span style="COLOR:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;\tInvocation Result: {0} for {1}&amp;quot;&lt;/span&gt;, expression.Compile().Invoke(target), target.GetType());
        &lt;span style="COLOR:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine();
    }
}&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;The above class writes to the console the lambda expression, the declaring type of the property and the value of the property for the target and the target’s type.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;Now, let’s look at what happens when used from this &lt;strong&gt;C#&lt;/strong&gt; code:&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:#2b91af;"&gt;Reporter&lt;/span&gt;.Report(&lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;C&lt;/span&gt;(), (&lt;span style="COLOR:#2b91af;"&gt;A &lt;/span&gt;a) =&amp;gt; a.P);
&lt;span style="COLOR:#2b91af;"&gt;Reporter&lt;/span&gt;.Report(&lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;C&lt;/span&gt;(), (&lt;span style="COLOR:#2b91af;"&gt;B &lt;/span&gt;b) =&amp;gt; b.P);
&lt;span style="COLOR:#2b91af;"&gt;Reporter&lt;/span&gt;.Report(&lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;C&lt;/span&gt;(), (&lt;span style="COLOR:#2b91af;"&gt;C &lt;/span&gt;c) =&amp;gt; c.P);

&lt;span style="COLOR:#2b91af;"&gt;Reporter&lt;/span&gt;.Report(&lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;B&lt;/span&gt;(), (&lt;span style="COLOR:#2b91af;"&gt;A &lt;/span&gt;a) =&amp;gt; a.P);
&lt;span style="COLOR:#2b91af;"&gt;Reporter&lt;/span&gt;.Report(&lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;B&lt;/span&gt;(), (&lt;span style="COLOR:#2b91af;"&gt;B &lt;/span&gt;b) =&amp;gt; b.P);

&lt;span style="COLOR:#2b91af;"&gt;Reporter&lt;/span&gt;.Report(&lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;A&lt;/span&gt;(), (&lt;span style="COLOR:#2b91af;"&gt;A &lt;/span&gt;a) =&amp;gt; a.P);&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;The output will be:&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;&lt;pre class="code"&gt;Expression: a =&amp;gt; a.P
        Declaring Type: A
        Invocation Result: C for C

Expression: b =&amp;gt; b.P
        Declaring Type: A
        Invocation Result: C for C

Expression: c =&amp;gt; c.P
        Declaring Type: A
        Invocation Result: C for C

Expression: a =&amp;gt; a.P
        Declaring Type: A
        Invocation Result: A for B

Expression: b =&amp;gt; b.P
        Declaring Type: A
        Invocation Result: A for B

Expression: a =&amp;gt; a.P
        Declaring Type: A
        Invocation Result: A for A&lt;/pre&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;On the other hand, if used from the equivalent &lt;strong&gt;Visual Basic&lt;/strong&gt; code:&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;&lt;pre class="code"&gt;Reporter.Report(&lt;span style="COLOR:blue;"&gt;New &lt;/span&gt;C(), &lt;span style="COLOR:blue;"&gt;Function&lt;/span&gt;(a &lt;span style="COLOR:blue;"&gt;As &lt;/span&gt;A) a.P)
Reporter.Report(&lt;span style="COLOR:blue;"&gt;New &lt;/span&gt;C(), &lt;span style="COLOR:blue;"&gt;Function&lt;/span&gt;(b &lt;span style="COLOR:blue;"&gt;As &lt;/span&gt;B) b.P)
Reporter.Report(&lt;span style="COLOR:blue;"&gt;New &lt;/span&gt;C(), &lt;span style="COLOR:blue;"&gt;Function&lt;/span&gt;(c &lt;span style="COLOR:blue;"&gt;As &lt;/span&gt;C) c.P)

Reporter.Report(&lt;span style="COLOR:blue;"&gt;New &lt;/span&gt;B(), &lt;span style="COLOR:blue;"&gt;Function&lt;/span&gt;(a &lt;span style="COLOR:blue;"&gt;As &lt;/span&gt;A) a.P)
Reporter.Report(&lt;span style="COLOR:blue;"&gt;New &lt;/span&gt;B(), &lt;span style="COLOR:blue;"&gt;Function&lt;/span&gt;(b &lt;span style="COLOR:blue;"&gt;As &lt;/span&gt;B) b.P)

Reporter.Report(&lt;span style="COLOR:blue;"&gt;New &lt;/span&gt;A(), &lt;span style="COLOR:blue;"&gt;Function&lt;/span&gt;(a &lt;span style="COLOR:blue;"&gt;As &lt;/span&gt;A) a.P)&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;The output will be:&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;&lt;pre class="code"&gt;Expression: a =&amp;gt; a.P
        Declaring Type: A
        Invocation Result: C for C

Expression: b =&amp;gt; b.P
        Declaring Type: A
        Invocation Result: C for C

Expression: c =&amp;gt; c.P
        Declaring Type: C
        Invocation Result: C for C

Expression: a =&amp;gt; a.P
        Declaring Type: A
        Invocation Result: A for B

Expression: b =&amp;gt; b.P
        Declaring Type: A
        Invocation Result: A for B

Expression: a =&amp;gt; a.P
        Declaring Type: A
        Invocation Result: A for A&lt;/pre&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;Why the differences? It’s because of each language’s specification and compiler:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;C#&lt;/strong&gt; compiler will issue a virtual call to the virtual member in the class where it’s declared as virtual. &lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Visual Basic&lt;/strong&gt; compiler will issue a virtual call to the overriding member on the class that overrides it. &lt;/li&gt;&lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1643213" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/VisualBasic/default.aspx">VisualBasic</category></item><item><title>Build Your Own LINQ Provider</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/05/07/build-your-own-linq-provider.aspx</link><pubDate>Wed, 07 May 2008 22:16:54 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1616627</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1616627</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1616627</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/05/07/build-your-own-linq-provider.aspx#comments</comments><description>&lt;p&gt;&lt;a title="Mehfuz&amp;#39;s WebLog" href="http://weblogs.asp.net/mehfuzh/" target="_blank"&gt;Mehfuz&lt;/a&gt; has been building a toolkit for creating &lt;a title="Language-Integrated Query (LINQ)" href="http://msdn2.microsoft.com/library/bb397926.aspx" target="_blank"&gt;LINQ&lt;/a&gt; providers and it&amp;#39;s available at &lt;a title="CodePlex" href="http://www.codeplex.com/" target="_blank"&gt;CodePlex&lt;/a&gt;: &lt;a title="LINQExtender" href="http://www.codeplex.com/LinqExtender" target="_blank"&gt;LINQExtender&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;He has even built a LINQ provider for &lt;a title="Flickr - Photo Sharing" href="http://www.flickr.com/" target="_blank"&gt;flickr&lt;/a&gt; with it: &lt;a title="LINQ.Flickr" href="http://www.codeplex.com/LINQFlickr" target="_blank"&gt;LINQ.Flickr&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1616627" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>TypeMock: How to Make Reflective Mocks More Natural</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/01/31/typemock-how-to-make-reflective-mocks-more-natural.aspx</link><pubDate>Thu, 31 Jan 2008 23:56:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1489214</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1489214</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1489214</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/01/31/typemock-how-to-make-reflective-mocks-more-natural.aspx#comments</comments><description>&lt;p&gt;Like I &lt;a title="TypeMock: Making Reflective Mocks More Natural" href="http://msmvps.com/blogs/paulomorgado/archive/2008/01/29/typemock-making-reflective-mocks-more-natural.aspx" target="_blank"&gt;said before&lt;/a&gt;, this as been on the back of my mind for a while.&lt;/p&gt;
&lt;p&gt;A while back &lt;a class="" title="Getting MethodInfo using LINQ" href="http://msmvps.com/blogs/paulomorgado/archive/2007/03/23/getting-methodinfo-using-linq.aspx" target="_blank"&gt;I introduced a way to get the MethodInfo&lt;/a&gt; of a method in a strongly typed way using &lt;a title="The LINQ Project" href="http://msdn2.microsoft.com/netframework/aa904594.aspx" target="_blank"&gt;LINQ&lt;/a&gt;, and that&amp;#39;s how I&amp;#39;m going to make &lt;a title="Overview" href="http://www.typemock.com/Docs/UserGuide/OverView.html" target="_blank"&gt;Reflective Mocks&lt;/a&gt; more &lt;a title="Natural TypeMocks™" href="http://www.typemock.com/Docs/UserGuide/NaturalMocks.html" target="_blank"&gt;Natural&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Well, it&amp;#39;s as easy as this:&lt;/p&gt;&lt;pre style="BORDER-RIGHT:thin outset;PADDING-RIGHT:10px;BORDER-TOP:thin groove;PADDING-LEFT:10px;BACKGROUND:#ffffff;OVERFLOW-X:auto;PADDING-BOTTOM:10px;BORDER-LEFT:thin groove;PADDING-TOP:10px;BORDER-BOTTOM:thin outset;FONT-FAMILY:consolas;"&gt;&lt;span style="COLOR:blue;"&gt;public static class &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;MockExtender
&lt;/span&gt;{
    &lt;span style="COLOR:blue;"&gt;public static &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;IParameters &lt;/span&gt;ExpectAndReturn&amp;lt;T1, T2, TResult&amp;gt;(&lt;span style="COLOR:blue;"&gt;this &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;IMockControl &lt;/span&gt;mock, &lt;span style="COLOR:#2b91af;"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="COLOR:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T1, T2, TResult&amp;gt;&amp;gt; expression, &lt;span style="COLOR:blue;"&gt;object &lt;/span&gt;ret, &lt;span style="COLOR:blue;"&gt;params &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Type&lt;/span&gt;[] genericTypes)
    {
        &lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;mock.ExpectAndReturn((expression.Body &lt;span style="COLOR:blue;"&gt;as &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;MethodCallExpression&lt;/span&gt;).Method.Name, ret, genericTypes);
    }
}&lt;/pre&gt;
&lt;p align="justify"&gt;(For now, I&amp;#39;ll leave to someone else the implementation of the rest of the overloads)&lt;/p&gt;
&lt;p align="justify"&gt;With this implementation it&amp;#39;s possible to handle static classes (a limitation of &lt;a title="iridescence.no" href="http://www.iridescence.no/" target="_blank"&gt;Fredrik&lt;/a&gt;&amp;#39;s &lt;a title="A Type Safe ExpectCall Extension Method for Reflective TypeMocks" href="http://www.iridescence.no/Posts/A-Type-Safe-ExpectCall-Extension-Method-for-Reflective-TypeMocks.aspx" target="_blank"&gt;implementation&lt;/a&gt;).&lt;/p&gt;
&lt;p align="justify"&gt;As for private methods, just let &lt;a title="Visual Studio Developer Center" href="http://msdn2.microsoft.com/en-us/vstudio/default.aspx" target="_blank"&gt;Visual Studio&lt;/a&gt; (2008, in this sample) and &lt;a title="TypeMock™ - Simplify Unit Testing" href="http://www.typemock.com/" target="_blank"&gt;TypeMock&lt;/a&gt; do their magic.&lt;/p&gt;
&lt;p align="justify"&gt;So, to test this class:&lt;/p&gt;&lt;pre style="BORDER-RIGHT:thin outset;PADDING-RIGHT:10px;BORDER-TOP:thin groove;PADDING-LEFT:10px;BACKGROUND:#ffffff;OVERFLOW-X:auto;PADDING-BOTTOM:10px;BORDER-LEFT:thin groove;PADDING-TOP:10px;BORDER-BOTTOM:thin outset;FONT-FAMILY:consolas;"&gt;&lt;span style="COLOR:blue;"&gt;public static class &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Class1
&lt;/span&gt;{
    &lt;span style="COLOR:blue;"&gt;public static string &lt;/span&gt;PublicMethod(&lt;span style="COLOR:blue;"&gt;string &lt;/span&gt;param1, &lt;span style="COLOR:blue;"&gt;int &lt;/span&gt;param2)
    {
        &lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;PrivateMethod(param2, param1);
    }

    &lt;span style="COLOR:blue;"&gt;private static string &lt;/span&gt;PrivateMethod(&lt;span style="COLOR:blue;"&gt;int &lt;/span&gt;param2, &lt;span style="COLOR:blue;"&gt;string &lt;/span&gt;param1)
    {
        &lt;span style="COLOR:blue;"&gt;throw new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;NotImplementedException&lt;/span&gt;();
    }
}&lt;/pre&gt;
&lt;p&gt;We just write this test:&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/p&gt;&lt;pre style="BORDER-RIGHT:thin outset;PADDING-RIGHT:10px;BORDER-TOP:thin groove;PADDING-LEFT:10px;BACKGROUND:#ffffff;OVERFLOW-X:auto;PADDING-BOTTOM:10px;BORDER-LEFT:thin groove;PADDING-TOP:10px;BORDER-BOTTOM:thin outset;FONT-FAMILY:consolas;"&gt;[&lt;span style="COLOR:#2b91af;"&gt;TestMethod&lt;/span&gt;()]
&lt;span style="COLOR:blue;"&gt;public void &lt;/span&gt;PublicMethodTest()
{
    &lt;span style="COLOR:blue;"&gt;string &lt;/span&gt;param1 = &lt;span style="COLOR:#a31515;"&gt;&amp;quot;param&amp;quot;&lt;/span&gt;;
    &lt;span style="COLOR:blue;"&gt;int &lt;/span&gt;param2 = 5;
    &lt;span style="COLOR:blue;"&gt;string &lt;/span&gt;expected = &lt;span style="COLOR:#a31515;"&gt;&amp;quot;return&amp;quot;&lt;/span&gt;;
    &lt;span style="COLOR:blue;"&gt;string &lt;/span&gt;actual;

    &lt;span style="COLOR:#2b91af;"&gt;Mock &lt;/span&gt;targetMock = &lt;span style="COLOR:#2b91af;"&gt;MockManager&lt;/span&gt;.Mock(&lt;span style="COLOR:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="COLOR:#2b91af;"&gt;Class1&lt;/span&gt;));

    targetMock.ExpectAndReturn((&lt;span style="COLOR:blue;"&gt;int &lt;/span&gt;i, &lt;span style="COLOR:blue;"&gt;string &lt;/span&gt;s) =&amp;gt; ClassLibrary1.&lt;span style="COLOR:#2b91af;"&gt;Class1_Accessor&lt;/span&gt;.PrivateMethod(i, s), expected).Args(param2, param1);

    actual = &lt;span style="COLOR:#2b91af;"&gt;Class1&lt;/span&gt;.PublicMethod(param1, param2);

    &lt;span style="COLOR:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(expected, actual);
}&lt;/pre&gt;
&lt;p&gt;How about this for clean and simple?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1489214" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MVP/default.aspx">MVP</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Tools/default.aspx">Tools</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Testing/default.aspx">Testing</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/UnitTests/default.aspx">UnitTests</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/TypeMock/default.aspx">TypeMock</category></item><item><title>Free e-books on the Visual Studio 2008 Learning Portal</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/01/03/free-e-books-on-the-visual-studio-2008-learning-portal.aspx</link><pubDate>Thu, 03 Jan 2008 00:23:58 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1433658</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1433658</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1433658</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/01/03/free-e-books-on-the-visual-studio-2008-learning-portal.aspx#comments</comments><description>&lt;p&gt;&lt;a title="Microsoft Corporation" href="http://www.microsoft.com/" target="_blank"&gt;Microsoft&lt;/a&gt; is &lt;a title="Free e-book offer" href="http://www.microsoft.com/learning/vstudio/2008/default.mspx#EBOOK" target="_blank"&gt;offering free e-books&lt;/a&gt; (or, at least some chapters) in the &lt;a title="Visual Studio 2008 - Learning Portal" href="http://www.microsoft.com/learning/vstudio/2008/" target="_blank"&gt;Visual Studio 2008 Learning Portal&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1433658" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MVP/default.aspx">MVP</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Web/default.aspx">Web</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Tools/default.aspx">Tools</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/VisualStudio/default.aspx">VisualStudio</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>Visual Studio 2008 and .NET Framework 3.5 shipped!</title><link>http://msmvps.com/blogs/paulomorgado/archive/2007/11/21/visual-studio-2008-and-net-framework-3-5-shipped.aspx</link><pubDate>Wed, 21 Nov 2007 00:21:36 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1342974</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1342974</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1342974</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2007/11/21/visual-studio-2008-and-net-framework-3-5-shipped.aspx#comments</comments><description>&lt;p&gt;&lt;a title="Visual Studio" href="http://msdn2.microsoft.com/en-us/vstudio/products/default.aspx" target="_blank"&gt;Visual Studio 2008&lt;/a&gt; and &lt;a title=".NET Framework" href="http://msdn2.microsoft.com/netframework/" target="_blank"&gt;.NET Framework 3.5&lt;/a&gt; has finally shipped.&lt;/p&gt; &lt;p&gt;&lt;a title="MSDN" href="http://msdn2.microsoft.com/" target="_blank"&gt;MSDN&lt;/a&gt; subscribers can &lt;a title="MSDN Subscribers: Get Visual Studio 2008 Now" href="http://msdn2.microsoft.com/subscriptions/bb608344.aspx" target="_blank"&gt;download the final version&lt;/a&gt; of &lt;a title="Visual Studio" href="http://msdn2.microsoft.com/en-us/vstudio/products/default.aspx" target="_blank"&gt;Visual Studio 2008&lt;/a&gt; from &lt;a title="MSDN Subscription Downloads" href="http://msdn2.microsoft.com/en-us/subscriptions/bb608344" target="_blank"&gt;MSDN Subscription Downloads&lt;/a&gt;, but anyone can get a &lt;a title="Download Trial Editions of Visual Studio 2008" href="http://msdn2.microsoft.com/en-us/vstudio/products/aa700831.aspx" target="_blank"&gt;trial version&lt;/a&gt; or an &lt;a title="Download Visual Studio 2008 Express Editions" href="http://www.microsoft.com/express" target="_blank"&gt;Express Edition&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The &lt;a title=".NET Framework" href="http://msdn2.microsoft.com/netframework/" target="_blank"&gt;.NET Framework 3.5&lt;/a&gt; contains many new features building incrementally upon .NET Framework 2.0 and 3.0, and includes .NET Framework 2.0 service pack 1 and .NET Framework 3.0 service pack 1. and is also &lt;a title="Download the .NET Framework 3.5" href="http://go.microsoft.com/?linkid=7755937" target="_blank"&gt;available for download&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;You can read all about it from various teams and team member&amp;#39;s blogs:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a title="Somasegar&amp;#39;s WebLog" href="http://blogs.msdn.com/somasegar/default.aspx" target="_blank"&gt;Soma S. Somasegar&lt;/a&gt;&lt;/li&gt; &lt;ul&gt; &lt;li&gt;&lt;a title="Visual Studio 2008 and .NET Framework 3.5 shipped!" href="http://blogs.msdn.com/somasegar/archive/2007/11/19/visual-studio-2008-and-net-framework-3-5-shipped.aspx" target="_blank"&gt;Visual Studio 2008 and .NET Framework 3.5 shipped!&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;&lt;a title="ScottGu&amp;#39;s Blog" href="http://weblogs.asp.net/scottgu/" target="_blank"&gt;Scott Guthrie&lt;/a&gt;&lt;/li&gt; &lt;ul&gt; &lt;li&gt;&lt;a title="Visual Studio 2008 and .NET 3.5 Released" href="http://weblogs.asp.net/scottgu/archive/2007/11/19/visual-studio-2008-and-net-3-5-released.aspx" target="_blank"&gt;Visual Studio 2008 and .NET 3.5 Released&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;&lt;a title="BCLTeam&amp;#39;s WebLog" href="http://blogs.msdn.com/bclteam/" target="_blank"&gt;BCL Team&lt;/a&gt;&lt;/li&gt; &lt;ul&gt; &lt;li&gt;&lt;a title=".NET Framework 3.5 Now Available! [Justin Van Patten]" href="http://blogs.msdn.com/bclteam/archive/2007/11/19/net-framework-3-5-now-available-justin-van-patten.aspx" target="_blank"&gt;.NET Framework 3.5 Now Available! [Justin Van Patten]&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;&lt;a title="Jack Gudenkauf (JackG) WebLog" href="http://blogs.msdn.com/jackg/" target="_blank"&gt;Jack Gudenkauf&lt;/a&gt;&lt;/li&gt; &lt;ul&gt; &lt;li&gt;&lt;a title="What&amp;rsquo;s new in the .Net Framework 3.5 (Orcas)" href="http://blogs.msdn.com/jackg/archive/2007/09/13/what-s-new-in-the-net-framework-3-5-orcas.aspx" target="_blank"&gt;What’s new in the .Net Framework 3.5 (Orcas)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;&lt;a title="Charlie Calvert&amp;#39;s Community Blog" href="http://blogs.msdn.com/charlie/" target="_blank"&gt;Charlie Calvert&lt;/a&gt;&lt;/li&gt; &lt;ul&gt; &lt;li&gt;&lt;a title="Visual Studio 2008 Available for Download" href="http://blogs.msdn.com/charlie/archive/2007/11/19/visual-studio-2008-available-for-download.aspx" target="_blank"&gt;Visual Studio 2008 Available for Download&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a title="Some Articles on Visual Studio 2008" href="http://blogs.msdn.com/charlie/archive/2007/11/20/some-articles-on-visual-studio-2008.aspx" target="_blank"&gt;Some Articles on Visual Studio 2008&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1342974" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/WinForms/default.aspx">WinForms</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLServer/default.aspx">SQLServer</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/XML/default.aspx">XML</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/VisualStudio/default.aspx">VisualStudio</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/WCF/default.aspx">WCF</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/WPF/default.aspx">WPF</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/WF/default.aspx">WF</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/WindowsClient/default.aspx">WindowsClient</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>Getting MethodInfo using LINQ</title><link>http://msmvps.com/blogs/paulomorgado/archive/2007/03/23/getting-methodinfo-using-linq.aspx</link><pubDate>Fri, 23 Mar 2007 12:06:42 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:703456</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=703456</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=703456</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2007/03/23/getting-methodinfo-using-linq.aspx#comments</comments><description>&lt;p&gt;At the last &lt;a title="MVP Global Summit" href="http://mvp.support.microsoft.com/MVPsummit" target="_blank"&gt;MVP Global Summit&lt;/a&gt;, &lt;a title="Mads Torgersen&amp;#39;s blog" href="http://blogs.msdn.com/madst/" target="_blank"&gt;Mads&lt;/a&gt; showed me and &lt;a title="Richard Hale Shaw&amp;#39;s Blog" href="http://richardhaleshawgroup.com/RHSGroup/Community/blogs/richard_hale_shaws_blog/default.aspx" target="_blank"&gt;Rich&lt;/a&gt; a way to get the &lt;a title="MethodInfo Class" href="http://msdn2.microsoft.com/library/system.reflection.methodinfo.aspx" target="_blank"&gt;MethodInfo&lt;/a&gt; of a method in a strongly typed way using &lt;a title="The LINQ Project" href="http://msdn2.microsoft.com/en-us/netframework/aa904594.aspx" target="_blank"&gt;LINQ&lt;/a&gt;. Here is how you can do it:&lt;/p&gt;&lt;pre style="border-right:thin outset;padding-right:10px;border-top:thin groove;padding-left:10px;background:#ffffff;padding-bottom:10px;overflow-x:auto;border-left:thin groove;padding-top:10px;border-bottom:thin outset;font-family:consolas;"&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;TypeHelper&lt;/span&gt;
{
    &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;delegate&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Method&lt;/span&gt;();
 
    &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;delegate&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Method&lt;/span&gt;&amp;lt;TArg0&amp;gt;(TArg0 arg0);
 
    &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;delegate&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Method&lt;/span&gt;&amp;lt;TArg0, TArg1&amp;gt;(TArg0 arg0, TArg1 arg1);
 
    &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;delegate&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Method&lt;/span&gt;&amp;lt;TArg0, TArg1, TArg2&amp;gt;(TArg0 arg0, TArg1 arg1, TArg2 arg2);
 
    &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;delegate&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Method&lt;/span&gt;&amp;lt;TArg0, TArg1, TArg2, TArg3&amp;gt;(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3);
 
    &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; System.Reflection.&lt;span style="color:#2b91af;"&gt;MethodInfo&lt;/span&gt; MethodInfoOf(System.Linq.Expressions.&lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Method&lt;/span&gt;&amp;gt; expression)
    {
        &lt;span style="color:blue;"&gt;return&lt;/span&gt; MethodInfoOfInternal(expression.Body &lt;span style="color:blue;"&gt;as&lt;/span&gt; System.Linq.Expressions.&lt;span style="color:#2b91af;"&gt;MethodCallExpression&lt;/span&gt;);
    }
 
    &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; System.Reflection.&lt;span style="color:#2b91af;"&gt;MethodInfo&lt;/span&gt; MethodInfoOf&amp;lt;TArg0&amp;gt;(System.Linq.Expressions.&lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Method&lt;/span&gt;&amp;lt;TArg0&amp;gt;&amp;gt; expression)
    {
        &lt;span style="color:blue;"&gt;return&lt;/span&gt; MethodInfoOfInternal(expression.Body &lt;span style="color:blue;"&gt;as&lt;/span&gt; System.Linq.Expressions.&lt;span style="color:#2b91af;"&gt;MethodCallExpression&lt;/span&gt;);
    }
 
    &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; System.Reflection.&lt;span style="color:#2b91af;"&gt;MethodInfo&lt;/span&gt; MethodInfoOf&amp;lt;TArg0, TArg1&amp;gt;(System.Linq.Expressions.&lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Method&lt;/span&gt;&amp;lt;TArg0, TArg1&amp;gt;&amp;gt; expression)
    {
        &lt;span style="color:blue;"&gt;return&lt;/span&gt; MethodInfoOfInternal(expression.Body &lt;span style="color:blue;"&gt;as&lt;/span&gt; System.Linq.Expressions.&lt;span style="color:#2b91af;"&gt;MethodCallExpression&lt;/span&gt;);
    }
 
    &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; System.Reflection.&lt;span style="color:#2b91af;"&gt;MethodInfo&lt;/span&gt; MethodInfoOf&amp;lt;TArg0, TArg1, TArg2&amp;gt;(System.Linq.Expressions.&lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Method&lt;/span&gt;&amp;lt;TArg0, TArg1, TArg2&amp;gt;&amp;gt; expression)
    {
        &lt;span style="color:blue;"&gt;return&lt;/span&gt; MethodInfoOfInternal(expression.Body &lt;span style="color:blue;"&gt;as&lt;/span&gt; System.Linq.Expressions.&lt;span style="color:#2b91af;"&gt;MethodCallExpression&lt;/span&gt;);
    }
 
    &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; System.Reflection.&lt;span style="color:#2b91af;"&gt;MethodInfo&lt;/span&gt; MethodInfoOf&amp;lt;TArg0, TArg1, TArg2, TArg3&amp;gt;(System.Linq.Expressions.&lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Method&lt;/span&gt;&amp;lt;TArg0, TArg1, TArg2, TArg3&amp;gt;&amp;gt; expression)
    {
        &lt;span style="color:blue;"&gt;return&lt;/span&gt; MethodInfoOfInternal(expression.Body &lt;span style="color:blue;"&gt;as&lt;/span&gt; System.Linq.Expressions.&lt;span style="color:#2b91af;"&gt;MethodCallExpression&lt;/span&gt;);
    }
 
    &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; System.Reflection.&lt;span style="color:#2b91af;"&gt;MethodInfo&lt;/span&gt; MethodInfoOfInternal(System.Linq.Expressions.&lt;span style="color:#2b91af;"&gt;MethodCallExpression&lt;/span&gt; methodCallExpression)
    {
        &lt;span style="color:blue;"&gt;return&lt;/span&gt; (methodCallExpression == &lt;span style="color:blue;"&gt;null&lt;/span&gt;) ? &lt;span style="color:blue;"&gt;null&lt;/span&gt; : methodCallExpression.Method;
    }
}&lt;/pre&gt;
&lt;p&gt;Usage is also very simple:&lt;/p&gt;&lt;pre style="border-right:thin outset;padding-right:10px;border-top:thin groove;padding-left:10px;background:#ffffff;padding-bottom:10px;overflow:auto;border-left:thin groove;padding-top:10px;border-bottom:thin outset;font-family:consolas;"&gt;&lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; F(&lt;span style="color:blue;"&gt;string&lt;/span&gt; s)
{
    &lt;span style="color:blue;"&gt;return&lt;/span&gt; !&lt;span style="color:blue;"&gt;string&lt;/span&gt;.IsNullOrEmpty(s);
}
 
&lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; M1()
{
}
 
&lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; M2(&lt;span style="color:blue;"&gt;string&lt;/span&gt; s)
{
}
 
&lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; M3(&lt;span style="color:blue;"&gt;string&lt;/span&gt; s1, &lt;span style="color:blue;"&gt;string&lt;/span&gt; s2)
{
}
 
&lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Main(&lt;span style="color:blue;"&gt;string&lt;/span&gt;[] args)
{
    &lt;span style="color:#2b91af;"&gt;MethodInfo&lt;/span&gt; fi = TypeHelper.MethodInfoOf((&lt;span style="color:blue;"&gt;string&lt;/span&gt; s) =&amp;gt; F(s));
    &lt;span style="color:#2b91af;"&gt;MethodInfo&lt;/span&gt; mi1 = TypeHelper.MethodInfoOf((&lt;span style="color:blue;"&gt;string&lt;/span&gt; s) =&amp;gt; M1());
    &lt;span style="color:#2b91af;"&gt;MethodInfo&lt;/span&gt; mi2 = TypeHelper.MethodInfoOf((&lt;span style="color:blue;"&gt;string&lt;/span&gt; s) =&amp;gt; M2(s));
    &lt;span style="color:#2b91af;"&gt;MethodInfo&lt;/span&gt; mi3 = TypeHelper.MethodInfoOf((&lt;span style="color:blue;"&gt;string&lt;/span&gt; s1, &lt;span style="color:blue;"&gt;string&lt;/span&gt; s2) =&amp;gt; M3(s1, s2));
}&lt;/pre&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=703456" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Community/default.aspx">Community</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MVP/default.aspx">MVP</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category></item></channel></rss>