<?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 : TipsAndTricks</title><link>http://msmvps.com/blogs/paulomorgado/archive/tags/TipsAndTricks/default.aspx</link><description>Tags: TipsAndTricks</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>Tip: Connecting To A Database Using Windows Authentication With Different Credentials Using SQL Server Management Studio</title><link>http://msmvps.com/blogs/paulomorgado/archive/2009/05/04/tip-connecting-to-a-database-using-windows-authentication-with-different-credentials-using-sql-server-management-studio.aspx</link><pubDate>Sun, 03 May 2009 23:34:19 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1691800</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1691800</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1691800</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2009/05/04/tip-connecting-to-a-database-using-windows-authentication-with-different-credentials-using-sql-server-management-studio.aspx#comments</comments><description>&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;It is a good security practice to use &lt;a title="Microsoft Windows" href="http://cli.gs/Microsoft-Windows" target="_blank"&gt;Windows&lt;/a&gt; Authentication to connect to &lt;a title="Microsoft SQL Server" href="http://www.microsoft.com/sqlserver/" target="_blank"&gt;SQL Server&lt;/a&gt; because you don’t need to write the password on some configuration file or registry entry.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;This practice also brings governance benefits. Managing users becomes part of domain administration and not part of each SQL Server instance’s administration.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;But this becomes an hassle to users (in this context, the user is someone that needs to perform administration task of some kind – a &lt;a title="Introducing SQL Server Management Studio" href="http://msdn.microsoft.com/library/ms174173.aspx" target="_blank"&gt;SQL Server Management Studio&lt;/a&gt; user) who need to connect to databases using different credentials.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;One workaround is using the &lt;a title="Runas" href="http://technet.microsoft.com/library/bb490994.aspx" target="_blank"&gt;runas&lt;/a&gt; command:&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;pre class="code"&gt;runas /user:&lt;em&gt;DOMAIN\USERNAME&lt;/em&gt; &amp;quot;C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Ssms.exe&amp;quot;&lt;/pre&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p&gt;But if you are working on an environment were there are several domains and your machine does not belong to the domain of the ser account you want to use, you’ll get the folloing error:&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;pre class="code"&gt;RUNAS ERROR: Unable to run - C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Ssms.exe
1787: The security database on the server does not have a computer account for this workstation trust relationship.&lt;/pre&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;But not everything is lost. Because you want to make a remote connection, you can use the &lt;strong&gt;/netonly&lt;/strong&gt; switch, and it works just fine:&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;pre class="code"&gt;runas /netonly /user:&lt;em&gt;DOMAIN\USERNAME&lt;/em&gt; &amp;quot;C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Ssms.exe&amp;quot;&lt;/pre&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;SQL Server Management Studio still shows all the databases in the server (unlike what happens if you connect from a machine logged in as the user you want to access to the SQL Server instance), but &lt;a title="Apex SQL Edit : A complete Editor / IDE for SQL Server" href="http://cli.gs/ApexSQL-Edit" target="_blank"&gt;ApexSQL Edit&lt;/a&gt; will only show the databases that account has access to.&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1691800" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLServer/default.aspx">SQLServer</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Windows/default.aspx">Windows</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/TipsAndTricks/default.aspx">TipsAndTricks</category></item></channel></rss>