<?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 : SoftDev</title><link>http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx</link><description>Tags: SoftDev</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>ReMIX 09 Is Coming To Lisbon, Portugal</title><link>http://msmvps.com/blogs/paulomorgado/archive/2009/09/09/remix-09-is-coming-to-lisbon-portugal.aspx</link><pubDate>Wed, 09 Sep 2009 18:50:28 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1722131</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=1722131</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1722131</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2009/09/09/remix-09-is-coming-to-lisbon-portugal.aspx#comments</comments><description>&lt;p&gt;&lt;a title="ReMIX 09 Portugal" href="http://www.microsoft.com/portugal/remix/index.aspx" target="_blank"&gt;&lt;img style="border-right-width:0px;margin:0px 10px 10px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="ReMIX 09" border="0" alt="ReMIX 09" align="left" src="https://www.microsoft.com/portugal/remix/res/img/remix_logo.gif" width="134" height="61" /&gt;&lt;/a&gt;For the first time, &lt;a title="MIX Online" href="http://www.visitmix.com/" target="_blank"&gt;ReMIX&lt;/a&gt; is coming to &lt;a title="Portugal" href="http://wikipedia.org/wiki/Portugal" target="_blank"&gt;Portugal&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The event will have a keynote and 3 tracks (Web Developer, UX and Architect) with 4 sessions each by the best speakers in each field.&lt;/p&gt;  &lt;p&gt;Don’t miss it! &lt;a title="ReMIX 09 Portugal" href="http://www.microsoft.com/portugal/remix/index.aspx" target="_blank"&gt;Register&lt;/a&gt; now!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1722131" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Architecture/default.aspx">Architecture</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/Events/default.aspx">Events</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/Web/default.aspx">Web</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Mix/default.aspx">Mix</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Mix09/default.aspx">Mix09</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Expression+Blend/default.aspx">Expression Blend</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Expression/default.aspx">Expression</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/ASP.NET+MVC/default.aspx">ASP.NET MVC</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Expression+Studio/default.aspx">Expression Studio</category></item><item><title>Windows Live Messenger Unable To Connect With Error Code 80040200</title><link>http://msmvps.com/blogs/paulomorgado/archive/2009/09/02/windows-live-messenger-unable-to-connect-with-error-code-80040200.aspx</link><pubDate>Tue, 01 Sep 2009 23:55:17 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1719985</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=1719985</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1719985</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2009/09/02/windows-live-messenger-unable-to-connect-with-error-code-80040200.aspx#comments</comments><description>&lt;p align="justify"&gt;Today I came across this issue when trying to sign in to &lt;a title="Windows Live Messenger" href="http://download.live.com/messenger" target="_blank"&gt;Windows Live Messenger&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Everyone I talked to was able to sign in, though, so I tried another account and was also able to sign in.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a title="Bing" href="http://www.bing.com/" target="_blank"&gt;Bing&lt;/a&gt;ing around, I found several blog posts pointing to a &lt;a title="Error: 8100030d" href="http://messenger-support.spaces.live.com/blog/cns!8B3F39C76A8B853F!13937.entry" target="_blank"&gt;post&lt;/a&gt; in the &lt;a title="Messenger Support Space&amp;#39;s Blog - Windows Live" href="http://messenger-support.spaces.live.com/blog/" target="_blank"&gt;Messenger Support blog&lt;/a&gt; with the solution to this problem. In my case (&lt;a title="Microsoft Windows 7" href="http://www.microsoft.com/windows/windows-7/" target="_blank"&gt;Windows 7&lt;/a&gt; x64) the solution would be to remove the &lt;strong&gt;%LOCALAPPDATA%\Microsoft\Windows Live Contacts&lt;/strong&gt; (usually &lt;strong&gt;C:\Users\&lt;em&gt;&amp;lt;Windows Logon name&amp;gt;&lt;/em&gt;\AppData\Local\Microsoft\Windows Live Contacts&lt;/strong&gt;) folder.&lt;/p&gt;  &lt;p&gt;Instead of removing the folder, I thought of renaming it to avoid removing my contacts for all account that were able to sign in. When I tried it, I got an error stating the the folder was already being used by another application.&lt;/p&gt;  &lt;p&gt;Since I had &lt;a title="Windows Live Mail" href="http://download.live.com/wlmail" target="_blank"&gt;Windows Live Mail&lt;/a&gt; open and assumed it uses the same contact store, I closed it and was able to sign in to messenger with no problems.&lt;/p&gt;  &lt;p&gt;As a developer and architect, I find it disturbing that such errors are presented to the user. The message hinted that there was a problem signing in to the server and, as it turned out, it was a problem with only one account for only one &lt;a title="Microsoft Windows" href="http://cli.gs/Microsoft-Windows" target="_blank"&gt;Windows&lt;/a&gt; user in only one machine.&lt;/p&gt;  &lt;p&gt;So, developers and architects out there (me included), always give the user an error message meaningful to what problem he/she is running into. Adding technical data to help support is nice but should be expressly accessed by the user (Windows Live Messenger got that part right).&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1719985" width="1" height="1"&gt;</description><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/WindowsLive/default.aspx">WindowsLive</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/WindowsLiveMessenger/default.aspx">WindowsLiveMessenger</category></item><item><title>Playing With SQL Server CLR Integration – Part IV (Deploying To SQL Server 2005)</title><link>http://msmvps.com/blogs/paulomorgado/archive/2009/06/13/playing-with-sql-server-clr-integration-part-iv-deploying-to-sql-server-2005.aspx</link><pubDate>Sat, 13 Jun 2009 08:39:10 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1695185</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=1695185</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1695185</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2009/06/13/playing-with-sql-server-clr-integration-part-iv-deploying-to-sql-server-2005.aspx#comments</comments><description>&lt;p&gt;With all developed and tested on my laptop using &lt;a title="Microsoft SQL Server" href="http://www.microsoft.com/sqlserver/" target="_blank"&gt;SQL Server&lt;/a&gt; 2008, it’s time to deploy to the company’s test machine running SQL Server 2005.&lt;/p&gt;  &lt;p&gt;The first thing I ran into when executing:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;CREATE ASSEMBLY &lt;/span&gt;[MyAssembly]
&lt;span style="color:blue;"&gt;AUTHORIZATION &lt;/span&gt;[dbo]
&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;...\MyAssembly.dll&amp;#39;
&lt;/span&gt;&lt;span style="color:blue;"&gt;WITH PERMISSION_SET &lt;/span&gt;&lt;span style="color:gray;"&gt;= &lt;/span&gt;&lt;span style="color:blue;"&gt;SAFE
GO&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;was:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:red;"&gt;Msg 10327, Level 14, State 1, Line 1
Assembly &amp;#39;MyAssembly&amp;#39; references assembly &amp;#39;system.xml.linq, version=3.5.0.0, culture=neutral, publickeytoken=b77a5c561934e089.&amp;#39;,
which is not present in the current database.
SQL Server attempted to locate and automatically load the referenced assembly from the same location where referring assembly came from,
but that operation has failed (reason: 2(The system cannot find the file specified.)).
Please load the referenced assembly into the current database and retry your request.&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Looks like SQL Server 2005 doesn’t know about &lt;a title="Microsoft .NET" href="http://cli.gs/cligs/Microsoft-NET" target="_blank"&gt;.NET Framework&lt;/a&gt; 3.5. I’d just load the assemblies being used: &lt;strong&gt;System.Core&lt;/strong&gt; and &lt;strong&gt;System.Linq.Xml&lt;/strong&gt;:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;CREATE ASSEMBLY &lt;/span&gt;[System.Core]
&lt;span style="color:blue;"&gt;AUTHORIZATION &lt;/span&gt;[dbo]
&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll&amp;#39;
&lt;/span&gt;&lt;span style="color:blue;"&gt;WITH PERMISSION_SET &lt;/span&gt;&lt;span style="color:gray;"&gt;= &lt;/span&gt;&lt;span style="color:blue;"&gt;SAFE
GO
&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Not so easy:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:black;"&gt;Warning: The Microsoft .Net frameworks assembly &amp;#39;system.core, version=3.5.0.0, culture=neutral, publickeytoken=b77a5c561934e089, processorarchitecture=msil.&amp;#39; you are registering is not fully tested in SQL Server hosted environment.&lt;/span&gt;
&lt;span style="color:red;"&gt;Msg 6218, Level 16, State 2, Line 1
CREATE ASSEMBLY for assembly &amp;#39;System.Core&amp;#39; failed because assembly &amp;#39;System.Core&amp;#39; failed verification. Check if the referenced assemblies are up-to-date and trusted (for external_access or unsafe) to execute in the database. CLR Verifier error messages if any will follow this message
[ : System.Diagnostics.Eventing.EventProvider::EtwRegister][mdToken=0x600003b][offset 0x0000003D][found Native Int][expected unmanaged pointer] Unexpected type on the stack.
[ : System.Diagnostics.Eventing.EventProvider::EncodeObject][mdToken=0x6000046][offset 0x00000000] Unmanaged pointers are not a verifiable type.
[ : System.Diagnostics.Eventing.EventProvider::WriteMessageEvent][mdToken=0x6000047][offset 0x0000003C][found ref &amp;#39;System.String&amp;#39;] Expected numeric type on the stack.
[ : System.Diagnostics.Eventing.EventProvider::WriteEvent][mdToken=0x6000049][offset 0x0000012E] Instruction cannot be verified.
[ : System.Diagnostics.Eventing.EventProvider::WriteEvent][mdToken=0x6000049][offset 0x00000030] Instruction cannot be verified.
[ : System.Diagnostics.Eventing.EventProvider::WriteEvent][mdToken=0x600004a][offset 0x0000005F][found ref &amp;#39;System.String&amp;#39;] Expected numeric type on the stack.
[ : System.Diagnostics.Eventing.EventProvider::WriteEvent][mdToken=0x600004b][offset 0x00000010][found unmanaged pointer][expected unmanaged pointer] Unexpected type on the stack.
[ : System.Diagnostics.Eventing.EventProvider::WriteTransferEvent][mdToken=0x600004c][offset 0x0000007D] Instruction cannot be verified.
[ : System.Diagnostics.Eventing.EventProvider::WriteTransferEvent][mdToken=0x600004c][offset 0x00000309][found Native Int][expected unmanaged pointer] Unexpected type on the stack.
[ : System.Diagnostics.Eventing.EventProvider::WriteTransferEvent][mdToken=0x600004d][offset 0x0000001B][found unmanaged pointer][expected unmanaged pointer] Unexpected type on the stack.
[ : System.Security.Cryptography.CapiNative::ImportSymmetricKey][mdToken=0x60007c2][offset 0x00000071][found address of Byte] Expected numeric type on the stac...&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Ok. I’d just load it with &lt;strong&gt;PERMISSION_SET = UNSAFE&lt;/strong&gt;:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;CREATE ASSEMBLY &lt;/span&gt;[MyAssembly]
&lt;span style="color:blue;"&gt;AUTHORIZATION &lt;/span&gt;[dbo]
&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;...\MyAssembly.dll&amp;#39;
&lt;/span&gt;&lt;span style="color:blue;"&gt;WITH PERMISSION_SET &lt;/span&gt;&lt;span style="color:gray;"&gt;= &lt;/span&gt;&lt;span style="color:blue;"&gt;UNSAFE
GO&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Not yet:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:black;"&gt;Warning: The Microsoft .Net frameworks assembly &amp;#39;system.core, version=3.5.0.0, culture=neutral, publickeytoken=b77a5c561934e089, processorarchitecture=msil.&amp;#39; you are registering is not fully tested in SQL Server hosted environment.&lt;/span&gt;
&lt;span style="color:red;"&gt;Msg 10327, Level 14, State 1, Line 1
CREATE ASSEMBLY for assembly &amp;#39;System.Core&amp;#39; failed because assembly &amp;#39;System.Core&amp;#39; is not authorized for PERMISSION_SET = UNSAFE.
The assembly is authorized when either of the following is true: the database owner (DBO) has UNSAFE ASSEMBLY permission and the database has the TRUSTWORTHY database property on; or the assembly is signed with a certificate or an asymmetric key that has a corresponding login with UNSAFE ASSEMBLY permission.
If you have restored or attached this database, make sure the database owner is mapped to the correct login on this server.
If not, use sp_changedbowner to fix the problem.&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Solved:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;ALTER DATABASE &lt;/span&gt;MyDatabase &lt;span style="color:blue;"&gt;SET TRUSTWORTHY ON
GO&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Only than I was able to load the .NET 3.5 assemblies:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;CREATE ASSEMBLY &lt;/span&gt;[System.Core]
&lt;span style="color:blue;"&gt;AUTHORIZATION &lt;/span&gt;[dbo]
&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll&amp;#39;
&lt;/span&gt;&lt;span style="color:blue;"&gt;WITH PERMISSION_SET &lt;/span&gt;&lt;span style="color:gray;"&gt;= &lt;/span&gt;&lt;span style="color:blue;"&gt;UNSAFE
GO

CREATE ASSEMBLY &lt;/span&gt;[System.Xml.Linq]
&lt;span style="color:blue;"&gt;AUTHORIZATION &lt;/span&gt;[dbo]
&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Xml.Linq.dll&amp;#39;
&lt;/span&gt;&lt;span style="color:blue;"&gt;WITH PERMISSION_SET &lt;/span&gt;&lt;span style="color:gray;"&gt;= &lt;/span&gt;&lt;span style="color:blue;"&gt;UNSAFE
GO&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;With all dependencies in place, I tried to load the assembly with &lt;strong&gt;PERMISSION_SET = SAFE&lt;/strong&gt; with no luck:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:red;"&gt;Msg 6212, Level 16, State 1, Line 1
CREATE ASSEMBLY failed because method &amp;#39;ShortPropsToXml&amp;#39; on type &amp;#39;ShortProps&amp;#39;  in safe assembly &amp;#39;Esi.SA.Encyclopedia&amp;#39; is storing to a static field.
Storing to a static field is not allowed in safe assemblies.&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;It had to be with &lt;strong&gt;PERMISSION_SET = UNSAFE&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;After successfully loading the assemblies, I was finally able to create the &lt;a title="Transact-SQL Overview" href="http://cli.gs/Transact-SQL" target="_blank"&gt;Transact-SQL&lt;/a&gt; definitions for the functions (see &lt;a title="Playing With SQL Server CLR Integration - Part I" href="http://cli.gs/gupt5m" target="_blank"&gt;Part I&lt;/a&gt; and &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;Now the DBAs won’t definitely let me use this, but it was fun to build it.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1695185" 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/SQLServer2005/default.aspx">SQLServer2005</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLCLR/default.aspx">SQLCLR</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>Playing With SQL Server CLR Integration – Part II</title><link>http://msmvps.com/blogs/paulomorgado/archive/2009/06/12/playing-with-sql-server-clr-integration-part-ii.aspx</link><pubDate>Thu, 11 Jun 2009 23:52:37 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1695052</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=1695052</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1695052</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2009/06/12/playing-with-sql-server-clr-integration-part-ii.aspx#comments</comments><description>&lt;p align="justify"&gt;On my last &lt;a title="Playing With SQL Server CLR Integration – Part I" href="http://cli.gs/gupt5m" target="_blank"&gt;post&lt;/a&gt;, I showed how to convert a property bag stored in text to a &lt;a title="CLR Table-Valued Functions" href="http://cli.gs/DGRt9u" target="_blank"&gt;CLR Table-Valued Function&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;I started thinking that I could retrieve the property values, but I couldn’t change them or add new properties.&lt;/p&gt;  &lt;p align="justify"&gt;Passing a table as a parameter is still not possible in &lt;a title="Microsoft SQL Server" href="http://www.microsoft.com/sqlserver/" target="_blank"&gt;SQL Server&lt;/a&gt; 2005. And that would force me to load the table into a variable, change it and load it back into the property bag.&lt;/p&gt;  &lt;p align="justify"&gt;Or I could create functions to Create, Update and Delete properties from the property bag.&lt;/p&gt;  &lt;p align="justify"&gt;Or I could just use XML. All it takes is creating a &lt;a title="CLR Scalar-Valued Functions" href="http://cli.gs/ySuXMU" target="_blank"&gt;CLR Scalar-Valued Function&lt;/a&gt; to convert the property bag to an XML representation and another to convert the XML back to the property bag format.&lt;/p&gt;  &lt;p align="justify"&gt;It still makes me load the property bag into a variable if I want to change it, but it’s usable in SQL Server 2005, which was the targeted platform.&lt;/p&gt;  &lt;p align="justify"&gt;Converting the property bag to an XML document is easy using the previously created enumerator:&lt;/p&gt;  &lt;pre class="code"&gt;[Microsoft.SqlServer.Server.&lt;span style="color:#2b91af;"&gt;SqlFunction&lt;/span&gt;(
    Name = &lt;span style="color:#a31515;"&gt;&amp;quot;ShortPropsToXml&amp;quot;&lt;/span&gt;,
    IsDeterministic = &lt;span style="color:blue;"&gt;true&lt;/span&gt;,
    IsPrecise = &lt;span style="color:blue;"&gt;false&lt;/span&gt;,
    DataAccess = &lt;span style="color:#2b91af;"&gt;DataAccessKind&lt;/span&gt;.None,
    SystemDataAccess = &lt;span style="color:#2b91af;"&gt;SystemDataAccessKind&lt;/span&gt;.None)]
&lt;span style="color:blue;"&gt;public static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SqlXml &lt;/span&gt;ShortPropsToXml(&lt;span style="color:blue;"&gt;string &lt;/span&gt;shortPropsText)
{
    &lt;span style="color:blue;"&gt;var &lt;/span&gt;xml = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;XElement&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;ShortProps&amp;quot;&lt;/span&gt;,
        &lt;span style="color:blue;"&gt;from &lt;/span&gt;shortProp &lt;span style="color:blue;"&gt;in &lt;/span&gt;ShortPropsEnumerable(shortPropsText)
        &lt;span style="color:blue;"&gt;select new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;XElement&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;p&amp;quot;&lt;/span&gt;,
            &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;XAttribute&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;n&amp;quot;&lt;/span&gt;, shortProp.Key),
            &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;XCData&lt;/span&gt;(shortProp.Value)));

    &lt;span style="color:blue;"&gt;using &lt;/span&gt;(&lt;span style="color:blue;"&gt;var &lt;/span&gt;buffer = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;MemoryStream&lt;/span&gt;())
    {
        &lt;span style="color:blue;"&gt;using &lt;/span&gt;(&lt;span style="color:blue;"&gt;var &lt;/span&gt;xmlWriter = &lt;span style="color:#2b91af;"&gt;XmlWriter&lt;/span&gt;.Create(buffer, &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;XmlWriterSettings &lt;/span&gt;{ CheckCharacters = &lt;span style="color:blue;"&gt;false &lt;/span&gt;}))
        {
            xml.WriteTo(xmlWriter);
        }

        buffer.Position = 0;

        &lt;span style="color:blue;"&gt;using &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;XmlReader &lt;/span&gt;xmlReader = &lt;span style="color:#2b91af;"&gt;XmlReader&lt;/span&gt;.Create(buffer, &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;XmlReaderSettings &lt;/span&gt;{ CheckCharacters = &lt;span style="color:blue;"&gt;false &lt;/span&gt;}))
        {
            &lt;span style="color:blue;"&gt;return new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SqlXml&lt;/span&gt;(xmlReader);
        }
    }
}&lt;/pre&gt;

&lt;p align="justify"&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Converting the an XML document back into the property bag format is also easy:&lt;/p&gt;

&lt;pre class="code"&gt;[Microsoft.SqlServer.Server.&lt;span style="color:#2b91af;"&gt;SqlFunction&lt;/span&gt;(
    Name = &lt;span style="color:#a31515;"&gt;&amp;quot;XmlToShortProps&amp;quot;&lt;/span&gt;,
    IsDeterministic = &lt;span style="color:blue;"&gt;true&lt;/span&gt;,
    IsPrecise = &lt;span style="color:blue;"&gt;false&lt;/span&gt;,
    DataAccess = &lt;span style="color:#2b91af;"&gt;DataAccessKind&lt;/span&gt;.None,
    SystemDataAccess = &lt;span style="color:#2b91af;"&gt;SystemDataAccessKind&lt;/span&gt;.None)]
&lt;span style="color:blue;"&gt;public static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SqlChars &lt;/span&gt;XmlToShortProps(&lt;span style="color:#2b91af;"&gt;SqlXml &lt;/span&gt;shortPropsXml)
{
    &lt;span style="color:blue;"&gt;var &lt;/span&gt;xml = &lt;span style="color:#2b91af;"&gt;XDocument&lt;/span&gt;.Parse(shortPropsXml.Value);

    &lt;span style="color:blue;"&gt;var &lt;/span&gt;textBuilder = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;StringBuilder&lt;/span&gt;();
    &lt;span style="color:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="color:blue;"&gt;var &lt;/span&gt;item &lt;span style="color:blue;"&gt;in &lt;/span&gt;xml.Document.Element(&lt;span style="color:#a31515;"&gt;&amp;quot;ShortProps&amp;quot;&lt;/span&gt;).Elements(&lt;span style="color:#a31515;"&gt;&amp;quot;p&amp;quot;&lt;/span&gt;))
    {
        textBuilder.AppendFormat(&lt;span style="color:#a31515;"&gt;&amp;quot;[[[{1}]]]{0}{2}{0}&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;Environment&lt;/span&gt;.NewLine, item.Attribute(&lt;span style="color:#a31515;"&gt;&amp;quot;n&amp;quot;&lt;/span&gt;).Value, item.Value);
    }

    &lt;span style="color:blue;"&gt;return new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SqlChars&lt;/span&gt;(textBuilder.ToString().ToCharArray());
}&lt;/pre&gt;

&lt;p align="justify"&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Now it’s just uploading the new version of the assembly to the database:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;ALTER ASSEMBLY &lt;/span&gt;[MyAssembly]
&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;...\MyAssembly.dll&amp;#39;
&lt;/span&gt;&lt;span style="color:blue;"&gt;GO&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;And defining the Scalar-Valued Functions in &lt;a title="Transact-SQL Overview" href="http://cli.gs/Transact-SQL" target="_blank"&gt;Transact-SQL&lt;/a&gt;:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;CREATE FUNCTION &lt;/span&gt;[dbo]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShortPropsToXml]&lt;span style="color:gray;"&gt;(&lt;/span&gt;@shortPropsText [nvarchar]&lt;span style="color:gray;"&gt;(&lt;/span&gt;4000&lt;span style="color:gray;"&gt;))
&lt;/span&gt;&lt;span style="color:blue;"&gt;RETURNS &lt;/span&gt;[xml] &lt;span style="color:blue;"&gt;WITH EXECUTE AS CALLER
AS 
EXTERNAL &lt;/span&gt;NAME [Esi.SA.Encyclopedia]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShortProps]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShortPropsToXml]
&lt;span style="color:blue;"&gt;GO
&lt;/span&gt;
&lt;span style="color:blue;"&gt;CREATE FUNCTION &lt;/span&gt;[dbo]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[XmlToShortProps]&lt;span style="color:gray;"&gt;(&lt;/span&gt;@shortPropsXml [xml]&lt;span style="color:gray;"&gt;)
&lt;/span&gt;&lt;span style="color:blue;"&gt;RETURNS &lt;/span&gt;[nvarchar]&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;&lt;span style="color:blue;"&gt;WITH EXECUTE AS CALLER
AS 
EXTERNAL &lt;/span&gt;NAME [Esi.SA.Encyclopedia]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShortProps]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[XmlToShortProps]
&lt;span style="color:blue;"&gt;GO
&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;And it’s all set to go.&lt;/p&gt;

&lt;p align="justify"&gt;Now, given this property bag definition:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;declare &lt;/span&gt;@text &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;&lt;span style="color:red;"&gt;&amp;#39;[[[name1]]]
value1
[[[name2]]]
value2
[[[name3]]]
value3
&amp;#39;
&lt;/span&gt;&lt;/pre&gt;

&lt;p align="justify"&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;I can change it into XML:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;DECLARE &lt;/span&gt;@xml [xml] &lt;span style="color:gray;"&gt;= &lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;ShortPropsToXml&lt;span style="color:gray;"&gt;(&lt;/span&gt;@text&lt;span style="color:gray;"&gt;)&lt;/span&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div align="justify"&gt;Update: &lt;/div&gt;

    &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;set &lt;/span&gt;@xml&lt;span style="color:gray;"&gt;.&lt;/span&gt;&lt;span style="color:blue;"&gt;modify&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;replace value of (/ShortProps/p[@n=&amp;quot;name2&amp;quot;]/text())[1] with &amp;quot;new value2&amp;quot;&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;)
&lt;/span&gt;&lt;/pre&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;Insert: &lt;/div&gt;

    &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;set &lt;/span&gt;@xml&lt;span style="color:gray;"&gt;.&lt;/span&gt;&lt;span style="color:blue;"&gt;modify&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;insert &amp;lt;p n=&amp;quot;name4&amp;quot;&amp;gt;Value4.1
Value4.2&amp;lt;/p&amp;gt; after (/ShortProps/p[@n=&amp;quot;name2&amp;quot;])[1]&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;)&lt;/span&gt;&lt;/pre&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;Delete &lt;/div&gt;

    &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;set &lt;/span&gt;@xml&lt;span style="color:gray;"&gt;.&lt;/span&gt;&lt;span style="color:blue;"&gt;modify&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;delete (/ShortProps/p[@n=&amp;quot;name3&amp;quot;])[1]&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;)&lt;/span&gt;&lt;/pre&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;p align="justify"&gt;Convert back to the property bag format: &lt;/p&gt;

    &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;print &lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;XmlToShortProps&lt;span style="color:gray;"&gt;(&lt;/span&gt;@xml&lt;span style="color:gray;"&gt;)&lt;/span&gt;&lt;/pre&gt;
    &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

    &lt;pre class="code"&gt;[[[name1]]]
value1
[[[name2]]]
new value2
[[[name4]]]
Value4.1
Value4.2&lt;/pre&gt;
    &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p align="justify"&gt;Query as a table: &lt;/p&gt;

    &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;select &lt;/span&gt;T&lt;span style="color:gray;"&gt;.&lt;/span&gt;C&lt;span style="color:gray;"&gt;.&lt;/span&gt;value&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;./@n&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;, &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;nvarchar(max)&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;) &lt;/span&gt;&lt;span style="color:blue;"&gt;as &lt;/span&gt;Name&lt;span style="color:gray;"&gt;, &lt;/span&gt;T&lt;span style="color:gray;"&gt;.&lt;/span&gt;C&lt;span style="color:gray;"&gt;.&lt;/span&gt;value&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;, &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;nvarchar(max)&amp;#39;&lt;/span&gt;&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;@xml&lt;span style="color:gray;"&gt;.&lt;/span&gt;nodes&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;/ShortProps/p&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;) &lt;/span&gt;T&lt;span style="color:gray;"&gt;(&lt;/span&gt;C&lt;span style="color:gray;"&gt;)&lt;/span&gt;&lt;/pre&gt;

    &lt;table style="border-bottom:black thin solid;border-left:black thin solid;border-top:black thin solid;border-right:black thin solid;"&gt;&lt;tbody&gt;
        &lt;tr&gt;
          &lt;th style="border-bottom:black thin solid;border-left:black thin solid;border-top:black thin solid;border-right:black thin solid;"&gt;Name&lt;/th&gt;

          &lt;th style="border-bottom:black thin solid;border-left:black thin solid;border-top:black thin solid;border-right:black thin solid;"&gt;Value&lt;/th&gt;
        &lt;/tr&gt;

        &lt;tr&gt;
          &lt;td style="border-bottom:black thin solid;border-left:black thin solid;border-top:black thin solid;border-right:black thin solid;"&gt;name1&lt;/td&gt;

          &lt;td style="border-bottom:black thin solid;border-left:black thin solid;border-top:black thin solid;border-right:black thin solid;"&gt;value1&lt;/td&gt;
        &lt;/tr&gt;

        &lt;tr&gt;
          &lt;td style="border-bottom:black thin solid;border-left:black thin solid;border-top:black thin solid;border-right:black thin solid;"&gt;name2&lt;/td&gt;

          &lt;td style="border-bottom:black thin solid;border-left:black thin solid;border-top:black thin solid;border-right:black thin solid;"&gt;new value2&lt;/td&gt;
        &lt;/tr&gt;

        &lt;tr&gt;
          &lt;td style="border-bottom:black thin solid;border-left:black thin solid;border-top:black thin solid;border-right:black thin solid;"&gt;name4&lt;/td&gt;

          &lt;td style="border-bottom:black thin solid;border-left:black thin solid;border-top:black thin solid;border-right:black thin solid;"&gt;Value4.1 
            &lt;br /&gt;Value4.2&lt;/td&gt;
        &lt;/tr&gt;
      &lt;/tbody&gt;&lt;/table&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p align="justify"&gt;Unfortunately, the application uses characters that are invalid to SQL Server as XML characters and I can’t use it on that application. I’ll have to understand those values better and add other fields to the table and XML.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1695052" 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/XML/default.aspx">XML</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>Playing With SQL Server CLR Integration – Part I</title><link>http://msmvps.com/blogs/paulomorgado/archive/2009/06/12/playing-with-sql-server-clr-integration-part-i.aspx</link><pubDate>Thu, 11 Jun 2009 23:41:14 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1695049</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=1695049</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1695049</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2009/06/12/playing-with-sql-server-clr-integration-part-i.aspx#comments</comments><description>&lt;p align="justify"&gt;I’m currently working with an application that stores a property bag in a &lt;a title="Microsoft SQL Server" href="http://www.microsoft.com/sqlserver/" target="_blank"&gt;SQL Server&lt;/a&gt; column like this:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:black;"&gt;[[[name1]]]
value1
[[[name2]]]
value2.1
value2.2
[[[name3]]]
value3&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;Don’t ask me why it’s done like this. It just is.&lt;/p&gt;

&lt;p align="justify"&gt;The application decodes this property bag into its inner structures and all works fine.&lt;/p&gt;

&lt;p align="justify"&gt;Sometimes I would like to query the database directly or do some reporting on those properties and just can’t.&lt;/p&gt;

&lt;p align="justify"&gt;So, I thought this was a good use case for SQL Server &lt;a title="Overview of CLR Integration" href="http://cli.gs/rDr0Yj" target="_blank"&gt;CLR Integration&lt;/a&gt;. I decided to build a &lt;a title="CLR Table-Valued Functions" href="http://cli.gs/DGRt9u" target="_blank"&gt;CLR Table-Valued Function&lt;/a&gt; that would return the property bag as a two column table.&lt;/p&gt;

&lt;p align="justify"&gt;Parsing the property bag text can easily be achieved with a simple regular expression:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Regex&lt;/span&gt;(
        &lt;span style="color:blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;@&amp;quot;(?&amp;lt;Name&amp;gt;(?&amp;lt;=\[\[\[).*(?=\]\]\]{0}))\]\]\]{0}(?&amp;lt;Value&amp;gt;(([\s\S]*?(?={0}\[\[\[))|([\s\S]*?(?={0}$))))&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;Environment&lt;/span&gt;.NewLine),
        &lt;span style="color:#2b91af;"&gt;RegexOptions&lt;/span&gt;.Multiline | &lt;span style="color:#2b91af;"&gt;RegexOptions&lt;/span&gt;.ExplicitCapture | &lt;span style="color:#2b91af;"&gt;RegexOptions&lt;/span&gt;.CultureInvariant | &lt;span style="color:#2b91af;"&gt;RegexOptions&lt;/span&gt;.Compiled);&lt;/pre&gt;

&lt;p align="justify"&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a title="Ultrapico" href="http://cli.gs/Ultrapico" target="_blank"&gt;Ultrapico&lt;/a&gt;’s &lt;a title="Ultrapico&amp;#39;s Expresso" href="http://cli.gs/Ultrapico-Expresso" target="_blank"&gt;Expresso&lt;/a&gt; was a big help when developing this regular expression.&lt;/p&gt;

&lt;p align="justify"&gt;In case you don’t know, the way CLR Table-Valued Function are built is using an initial method to take the input and return an IEnumerable and row filler method the receives the enumerator item and outputs the column values.&lt;/p&gt;

&lt;p align="justify"&gt;Since these are really key-value pairs of strings, I decided to use &lt;a title="KeyValuePair&amp;lt;(Of &amp;lt;(TKey, TValue&amp;gt;)&amp;gt;) Structure" href="http://msdn.microsoft.com/library/5tbh8a42.aspx" target="_blank"&gt;)&amp;gt;) Structure&amp;quot; href=&amp;quot;http://msdn.microsoft.com/library/5tbh8a42.aspx&amp;quot; target=_blank&amp;gt;KeyValuePair&lt;/a&gt;&amp;lt;string, string&amp;gt; instances to store each item and the enumerator became simply this:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;private static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;KeyValuePair&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;, &lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt;&amp;gt; ShortPropsEnumerable(&lt;span style="color:blue;"&gt;string &lt;/span&gt;shortPropsText)
{
    &lt;span style="color:blue;"&gt;return from &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Match &lt;/span&gt;m &lt;span style="color:blue;"&gt;in &lt;/span&gt;shortPropsRegex.Matches(shortPropsText)
           &lt;span style="color:blue;"&gt;select new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;KeyValuePair&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;, &lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt;(m.Groups[&lt;span style="color:#a31515;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;].Value, m.Groups[&lt;span style="color:#a31515;"&gt;&amp;quot;Value&amp;quot;&lt;/span&gt;].Value);
}&lt;/pre&gt;

&lt;p align="justify"&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;And the implementation of the CLR Table-Valued Function is as simple as this: &lt;/p&gt;

&lt;pre class="code"&gt;[Microsoft.SqlServer.Server.&lt;span style="color:#2b91af;"&gt;SqlFunction&lt;/span&gt;(
    Name = &lt;span style="color:#a31515;"&gt;&amp;quot;ShortPropsToTable&amp;quot;&lt;/span&gt;,
    FillRowMethodName = &lt;span style="color:#a31515;"&gt;&amp;quot;ShortPropsToTableFillRow&amp;quot;&lt;/span&gt;,
    TableDefinition = &lt;span style="color:#a31515;"&gt;&amp;quot;Name NVARCHAR(4000), Value NVARCHAR(4000)&amp;quot;&lt;/span&gt;,
    IsDeterministic = &lt;span style="color:blue;"&gt;true&lt;/span&gt;,
    IsPrecise = &lt;span style="color:blue;"&gt;false&lt;/span&gt;,
    DataAccess = &lt;span style="color:#2b91af;"&gt;DataAccessKind&lt;/span&gt;.None,
    SystemDataAccess = &lt;span style="color:#2b91af;"&gt;SystemDataAccessKind&lt;/span&gt;.None)]
&lt;span style="color:blue;"&gt;public static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IEnumerable &lt;/span&gt;ShortPropsToTable(&lt;span style="color:blue;"&gt;string &lt;/span&gt;shortPropsText)
{
    &lt;span style="color:blue;"&gt;return &lt;/span&gt;ShortPropsEnumerable(shortPropsText);
}

&lt;span style="color:blue;"&gt;public static void &lt;/span&gt;ShortPropsToTableFillRow(&lt;span style="color:blue;"&gt;object &lt;/span&gt;item, &lt;span style="color:blue;"&gt;out &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SqlChars &lt;/span&gt;name, &lt;span style="color:blue;"&gt;out &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SqlChars &lt;/span&gt;value)
{
    &lt;span style="color:#2b91af;"&gt;KeyValuePair&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;, &lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; shortProp = (&lt;span style="color:#2b91af;"&gt;KeyValuePair&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;, &lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt;)item;

    name = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SqlChars&lt;/span&gt;(shortProp.Key);
    value = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SqlChars&lt;/span&gt;(shortProp.Value);
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;To use this in SQL Server a few simple steps are need:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;div align="justify"&gt;Load the assembly into the database: &lt;/div&gt;

    &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;CREATE ASSEMBLY &lt;/span&gt;[MyAssembly]
&lt;span style="color:blue;"&gt;AUTHORIZATION &lt;/span&gt;[dbo]
&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;...\MyAssembly.dll&amp;#39;
&lt;/span&gt;&lt;span style="color:blue;"&gt;WITH PERMISSION_SET &lt;/span&gt;&lt;span style="color:gray;"&gt;= &lt;/span&gt;&lt;span style="color:blue;"&gt;SAFE
GO&lt;/span&gt;&lt;/pre&gt;
    &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;Defining the &lt;a title="Table-Valued User-Defined Functions" href="http://cli.gs/GngXhh" target="_blank"&gt;Table-Valued User-Defined Function&lt;/a&gt; in &lt;a title="Transact-SQL Overview" href="http://cli.gs/Transact-SQL" target="_blank"&gt;Transact-SQL&lt;/a&gt;: &lt;/div&gt;

    &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;CREATE FUNCTION &lt;/span&gt;[dbo]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShortPropsToTable]&lt;span style="color:gray;"&gt;(&lt;/span&gt;@shortPropsText [nvarchar]&lt;span style="color:gray;"&gt;(&lt;/span&gt;4000&lt;span style="color:gray;"&gt;))
&lt;/span&gt;&lt;span style="color:blue;"&gt;RETURNS  TABLE &lt;/span&gt;&lt;span style="color:gray;"&gt;(
    &lt;/span&gt;[Name] [nvarchar]&lt;span style="color:gray;"&gt;(&lt;/span&gt;4000&lt;span style="color:gray;"&gt;) NULL,
    &lt;/span&gt;[Value] [nvarchar]&lt;span style="color:gray;"&gt;(&lt;/span&gt;4000&lt;span style="color:gray;"&gt;) NULL
) &lt;/span&gt;&lt;span style="color:blue;"&gt;WITH EXECUTE AS CALLER
AS 
EXTERNAL &lt;/span&gt;NAME [MyAssembly]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShortProps]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShortPropsToTable]
&lt;span style="color:blue;"&gt;GO
&lt;/span&gt;&lt;/pre&gt;
    &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;Enable CLR Integration: &lt;/div&gt;

    &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;EXEC &lt;/span&gt;&lt;span style="color:maroon;"&gt;sp_configure &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;clr enabled&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;, &lt;/span&gt;1
&lt;span style="color:blue;"&gt;GO
RECONFIGURE
GO
&lt;/span&gt;&lt;/pre&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p align="justify"&gt;And all is set to go.&lt;/p&gt;

&lt;p align="justify"&gt;Now I can just query the property bag as a table:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;SELECT
    &lt;/span&gt;e&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ID]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;e&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Name]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;e&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Class]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;e&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Type]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;p&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Name]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;p&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Value]
&lt;span style="color:blue;"&gt;FROM
    &lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;Entity &lt;span style="color:blue;"&gt;as &lt;/span&gt;e
    &lt;span style="color:gray;"&gt;CROSS APPLY &lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;ShortPropsToTable&lt;span style="color:gray;"&gt;(&lt;/span&gt;e&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShortProps]&lt;span style="color:gray;"&gt;) &lt;/span&gt;&lt;span style="color:blue;"&gt;as &lt;/span&gt;p&lt;/pre&gt;

&lt;p align="justify"&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Just for curiosity, for a little over 50000 entities (that can be retrieved on about 1 second on my laptop), I got a little under 630000 properties in les then 40 seconds.&lt;/p&gt;

&lt;p align="justify"&gt;40 seconds might seem a lot compared to the 1 second, but I would like to see better times using T-SQL. And develop and test the TVF in just a couple of hours.&lt;/p&gt;

&lt;p align="justify"&gt;Now, if only he DBAs would allow me to use it. It doesn’t fit into the company’s “security policy”, you know.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1695049" 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/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>Typemock Is Launching The ASP.NET Bundle – Get Free Licenses</title><link>http://msmvps.com/blogs/paulomorgado/archive/2009/05/18/typemock-is-launching-the-asp-net-bundle-get-free-licenses.aspx</link><pubDate>Mon, 18 May 2009 22:57:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1692642</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=1692642</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1692642</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2009/05/18/typemock-is-launching-the-asp-net-bundle-get-free-licenses.aspx#comments</comments><description>&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;&lt;a title="Typemock - Simplify Unit Testing!" href="http://cli.gs/Typemock" target="_blank"&gt;Typemock&lt;/a&gt; is launching a new product for ASP.NET developers – the &lt;strong&gt;ASP.NET Bundle&lt;/strong&gt; - and for the launch they are giving out &lt;strong&gt;FREE licenses&lt;/strong&gt; to bloggers and their readers.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;The ASP.NET Bundle is the ultimate ASP.NET unit testing solution, and offers both Typemock &lt;a title="Typemock Isolator" href="http://cli.gs/TypemockIsolator" target="_blank"&gt;Isolator&lt;/a&gt; and &lt;a title="Ivonna - ASP.NET Unit Testing Tool" href="http://cli.gs/Ivonna" target="_blank"&gt;Ivonna&lt;/a&gt;, the ASP.NET Isolator add-on, for a discounted price.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;&lt;strong&gt;ASP.NET Bundle launch giveaway:&lt;/strong&gt; &lt;br /&gt;For the ASP.NET Bundle launch Typemock are giving away free licenses to bloggers and their readers.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;&lt;strong&gt;How do I get the free license?&lt;/strong&gt;&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;Are you a blogger, webmaster, or internet columnist? Get your free license by helping&amp;nbsp;Typemock launch&amp;nbsp;their new ASP.NET Bundle, the ultimate ASP.NET unit testing solution.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;Post the text below on your blog (as is, with links) and &lt;a href="mailto:asp@typemock.com"&gt;tell them about it&lt;/a&gt; . If you are in the first 60 to mail us after posting, your license will be on its way!&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;If you have an ASP.NET dedicated blog, you&amp;#39;ll get a license automatically (even if more than 60 submit) during the first week of this announcement.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;8 bloggers will also get an additional 2 licenses (each) to give away / raffle to their readers or friends.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;A few simple requirements:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;div align="justify"&gt;You must own a website, blog space or internet column, older than 2 months, or get permission from the owner of such a site.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;div align="justify"&gt;Your post must include the text below (including the links) between *Begin* and *End*.&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;&lt;strong&gt;*Begin*&lt;/strong&gt;&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p style="TEXT-ALIGN:justify;MARGIN-LEFT:20px;"&gt;&lt;a href="http://www.typemock.com/" target="_blank"&gt;Unit Testing&lt;/a&gt; ASP.NET? &lt;a href="http://www.typemock.com/ASP.NET_unit_testing_page.php" target="_blank"&gt;ASP.NET unit testing&lt;/a&gt; has never been this easy.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p style="TEXT-ALIGN:justify;MARGIN-LEFT:20px;"&gt;Typemock is launching a new product for ASP.NET developers – the &lt;strong&gt;ASP.NET Bundle&lt;/strong&gt; - and for the launch will be giving out &lt;strong&gt;FREE licenses&lt;/strong&gt; to bloggers and their readers.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p style="TEXT-ALIGN:justify;MARGIN-LEFT:20px;"&gt;The ASP.NET Bundle is the ultimate ASP.NET unit testing solution, and offers both &lt;a href="http://www.typemock.com/" target="_blank"&gt;Typemock Isolator&lt;/a&gt;, a &lt;a href="http://www.typemock.com/" target="_blank"&gt;unit test&lt;/a&gt; tool and &lt;a href="http://sm-art.biz/Ivonna.aspx" target="_blank"&gt;Ivonna&lt;/a&gt;, the Isolator add-on for &lt;a href="http://sm-art.biz/Ivonna.aspx" target="_blank"&gt;ASP.NET unit testing&lt;/a&gt;, for a bargain price.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p style="TEXT-ALIGN:justify;MARGIN-LEFT:20px;"&gt;Typemock Isolator is a leading &lt;a href="http://www.typemock.com/" target="_blank"&gt;.NET unit testing&lt;/a&gt; tool (C# and VB.NET) for many ‘hard to test’ technologies such as &lt;a href="http://typemock.com/sharepointpage.php" target="_blank"&gt;SharePoint&lt;/a&gt;, &lt;a href="http://www.typemock.com/ASP.NET_unit_testing_page.php" target="_blank"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://www.typemock.com/ASP.NET_unit_testing_page.php" target="_blank"&gt;MVC&lt;/a&gt;, &lt;a href="http://www.typemock.com/wcfpage.php" target="_blank"&gt;WCF&lt;/a&gt;, WPF, &lt;a href="http://www.typemock.com/Silverlight_unit_testing_page.php" target="_blank"&gt;Silverlight&lt;/a&gt; and more. Note that for &lt;a href="http://www.typemock.com/Silverlight_unit_testing_page.php" target="_blank"&gt;unit testing Silverlight&lt;/a&gt; there is an open source Isolator add-on called &lt;a href="http://www.typemock.com/Silverlight_unit_testing_page.php" target="_blank"&gt;SilverUnit&lt;/a&gt;.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p style="TEXT-ALIGN:justify;MARGIN-LEFT:20px;"&gt;The first 60 bloggers who will blog this text in their blog and &lt;a href="http://blog.typemock.com/2009/05/get-free-typemock-licenses-aspnet.html" target="_blank"&gt;tell us about it&lt;/a&gt;, will get a Free Isolator ASP.NET Bundle license (Typemock Isolator + Ivonna). If you post this in an ASP.NET &lt;strong&gt;dedicated&lt;/strong&gt; blog, you&amp;#39;ll get a license automatically (even if more than 60 submit) during the first week of this announcement.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p style="TEXT-ALIGN:justify;MARGIN-LEFT:20px;"&gt;Also 8 bloggers will get an &lt;strong&gt;additional 2 licenses&lt;/strong&gt; (each) to give away to their readers / friends.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p style="TEXT-ALIGN:justify;MARGIN-LEFT:20px;"&gt;Go ahead, click the following link for &lt;a href="http://blog.typemock.com/2009/05/get-free-typemock-licenses-aspnet.html" target="_blank"&gt;more information&lt;/a&gt; on how to get your free license.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;&lt;strong&gt;*End*&lt;/strong&gt;&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;Once you post this in your site, just drop them a line at &lt;a href="mailto:asp@typemock.com"&gt;asp@typemock.com&lt;/a&gt; with your name and the post URL to get your free license.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;Hurry up – this offer is limited to the first 60 bloggers, or to ASP.NET dedicated bloggers who will post this in the first week.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;Make sure to follow their &lt;a title="The Typemock Inseider - The Official Typemock Blog, by the Typemock developers" href="http://cli.gs/TypemockInsiderBlog" target="_blank"&gt;Blog&lt;/a&gt;, &lt;a title="Typemock - Simplify Unit Testing!" href="http://cli.gs/Typemock" target="_blank"&gt;Site&lt;/a&gt; or &lt;a title="Typemock Twitter" href="http://cli.gs/TypemockTwitter" target="_blank"&gt;Twitter&lt;/a&gt; for updates on this event.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;&lt;a title="Unit Test Today! Get Typemock Isolator!" href="http://www.typemock.com/cart.php?p=Commercial&amp;amp;maint=on&amp;amp;quantity=1&amp;amp;referrer=485128" target="_blank"&gt;&lt;img alt="Unit Test Today! Get Typemock Isolator!" src="https://secure.plimus.com//developers//485128/Typemock_button_blue.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1692642" 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/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/UnitTests/default.aspx">UnitTests</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/TypeMock/default.aspx">TypeMock</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>ASP.NET Futures: Control ClientID Generation</title><link>http://msmvps.com/blogs/paulomorgado/archive/2009/03/18/asp-net-futures-control-clientid-generation.aspx</link><pubDate>Wed, 18 Mar 2009 01:44:50 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1678872</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=1678872</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1678872</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2009/03/18/asp-net-futures-control-clientid-generation.aspx#comments</comments><description>&lt;p&gt;&lt;a title="ASP.NET Developer Center" href="http://msdn.microsoft.com/asp.net/" target="_blank"&gt;ASP.NET&lt;/a&gt; is expected to have some &lt;a title="ASP.NET 4.0 ClientID Overview" href="http://cli.gs/0ZX9W7" target="_blank"&gt;improvements on the generation of client IDs&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Although this is a major improvement, it comes short by not allowing the generation of shorter client IDs for server controls.&lt;/p&gt;  &lt;p&gt;My good friend &lt;a title="Nuno Gomes {Code Adventures}" href="http://cli.gs/NunoGomes" target="_blank"&gt;Nuno Gomes&lt;/a&gt; has done some work on generating shorter client IDs for controls (*).&lt;/p&gt;  &lt;p&gt;&lt;a title="jeff chin xyz" href="http://cli.gs/2EJjzX" target="_blank"&gt;Jeff&lt;/a&gt; has taken it one step further with his &lt;a title="How to shorten ASP.NET automatically generated control IDs" href="http://cli.gs/EpT9Bt" target="_blank"&gt;How to shorten ASP.NET automatically generated control IDs&lt;/a&gt; article on &lt;a title="The Code Project - Your Development Resource" href="http://www.codeproject.com/" target="_blank"&gt;CodeProject&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;If you want to see a running example, check out &lt;a title="http://www.biocompare.com/" href="http://www.biocompare.com/" target="_blank"&gt;http://www.biocompare.com/&lt;/a&gt;.&lt;/p&gt;  &lt;div style="border-top:1px solid;"&gt;(*)    &lt;ul&gt;     &lt;li&gt;&lt;a title="ASP.NET Controls - Improving automatic ID generation : Introduction ( Part 1)" href="http://cli.gs/qGgq3X" target="_blank"&gt;ASP.NET Controls - Improving automatic ID generation : Introduction ( Part 1)&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;&lt;a title="ASP.NET Controls - Improving automatic ID generation : Concept ( Part 2)" href="http://cli.gs/JLteEZ" target="_blank"&gt;ASP.NET Controls - Improving automatic ID generation : Concept ( Part 2)&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;&lt;a title="ASP.NET Controls - Improving automatic ID generation - Architectural Changes ( Part 3)" href="http://cli.gs/TSE9Jv"&gt;ASP.NET Controls - Improving automatic ID generation - Architectural Changes ( Part 3)&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;&lt;a title="ASP.NET Controls - Improving automatic ID generation : The ShortIDs Naming Provider (Part 4)" href="http://cli.gs/7rEWmy" target="_blank"&gt;ASP.NET Controls - Improving automatic ID generation : The ShortIDs Naming Provider (Part 4)&lt;/a&gt; &lt;/li&gt;   &lt;/ul&gt; &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1678872" 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/Web/default.aspx">Web</category></item><item><title>How To Issue Server Callbacks</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/12/15/how-to-issue-server-callbacks.aspx</link><pubDate>Mon, 15 Dec 2008 01:03:48 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1656740</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=1656740</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1656740</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/12/15/how-to-issue-server-callbacks.aspx#comments</comments><description>&lt;p align="justify"&gt;&lt;a title="Implementing Client Callbacks Programmatically Without Postbacks in ASP.NET Web Pages" href="http://msdn.microsoft.com/library/ms178208.aspx" target="_blank"&gt;Callbacks&lt;/a&gt; were introduced in &lt;a title="ASP.NET Developer Center" href="http://msdn.microsoft.com/asp.net/" target="_blank"&gt;ASP.NET&lt;/a&gt; 2.0 and is a simple mechanism for calling &lt;a title="Page Class" href="http://msdn.microsoft.com/library/system.web.ui.page.aspx" target="_blank"&gt;page&lt;/a&gt; or &lt;a title="WebControl Class" href="http://msdn.microsoft.com/library/system.web.ui.webcontrols.webcontrol.aspx" target="_blank"&gt;control&lt;/a&gt; functionality without page rendering and without the user noticing a post back.&lt;/p&gt;  &lt;p align="justify"&gt;For a page or control to handle callbacks, all it needs is to implement the &lt;a title="ICallbackEventHandler Interface" href="http://msdn.microsoft.com/library/system.web.ui.icallbackeventhandler.aspx" target="_blank"&gt;ICallbackEventHandler&lt;/a&gt; Interface.&lt;/p&gt;  &lt;p align="justify"&gt;When the client calls back to de page or control, the initial state of the controls is posted along with the control being called upon in the __CALLBACKID field and the callback parameter in the __CALLBACKPARAM field.&lt;/p&gt;  &lt;p align="justify"&gt;It’s quite a simple procedure.&lt;/p&gt;  &lt;p align="justify"&gt;But what if you want to issue a callback server side?&lt;/p&gt;  &lt;p align="justify"&gt;In order for a request to be identified as a callback (&lt;a title="Page.IsCallback Property" href="http://msdn.microsoft.com/en-us/library/system.web.ui.page.iscallback.aspx" target="_blank"&gt;IsCallback&lt;/a&gt;), the request must be a postback (&lt;a title="Page.IsPostback Property" href="http://msdn.microsoft.com/en-us/library/system.web.ui.page.ispostback.aspx" target="_blank"&gt;IsPostback&lt;/a&gt;) and the before mentioned fields must be in the post data of the request. On the other hand, for a request to be considered a postback, the level of server calls (&lt;a title="Transfer Method" href="http://msdn.microsoft.com/en-us/library/system.web.httpserverutility.transfer.aspx" target="_blank"&gt;Transfer&lt;/a&gt; or &lt;a title="Execute Method" href="http://msdn.microsoft.com/en-us/library/system.web.httpserverutility.execute.aspx" target="_blank"&gt;Execute&lt;/a&gt;) must be 0 (meaning that the current request hasn’t made any Transfer or Execute calls) or the type of the page is the same of the &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.httpcontext.handler.aspx" target="_blank"&gt;Handler&lt;/a&gt; for the current request and the HTTP method is POST.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;Changing the HTTP method is (as far as I know) impossible. So, if the request is not already a POST, there’s no way to issue a callback.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;Setting the post data is easier. All it’s needed is to override the page’s &lt;a title="DeterminePostBackMode Method" href="http://msdn.microsoft.com/en-us/library/system.web.ui.page.DeterminePostBackMode.aspx" target="_blank"&gt;DeterminePostBackMode&lt;/a&gt; method (or in a &lt;a title="PageAdapter Class" href="http://msdn.microsoft.com/en-us/library/System.Web.UI.Adapters.PageAdapter.aspx" target="_blank"&gt;page adapter&lt;/a&gt;) and return the post data previously saved in a context item. Something like this:&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;pre class="code"&gt;&lt;span&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;protected override &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;NameValueCollection &lt;/span&gt;&lt;span&gt;DeterminePostBackMode()
{
    &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;NameValueCollection &lt;/span&gt;&lt;span&gt;postBackMode = Context.Items[&lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;callbackPostData&amp;quot;&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span style="color:blue;"&gt;as &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;NameValueCollection&lt;/span&gt;&lt;span&gt;;

    &lt;/span&gt;&lt;span style="color:blue;"&gt;return &lt;/span&gt;&lt;span&gt;(postBackMode != &lt;/span&gt;&lt;span style="color:blue;"&gt;null&lt;/span&gt;&lt;span&gt;) ? postBackMode : &lt;/span&gt;&lt;span style="color:blue;"&gt;base&lt;/span&gt;&lt;span&gt;.DeterminePostBackMode();
}&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 align="justify"&gt;And issue a callback is something like this:&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;pre class="code"&gt;&lt;span style="color:#2b91af;"&gt;IHttpHandler &lt;/span&gt;&lt;span&gt;handler = &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;&lt;span&gt;.Context.Handler;
&lt;/span&gt;&lt;span style="color:blue;"&gt;try
&lt;/span&gt;&lt;span&gt;{
    &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;NameValueCollection &lt;/span&gt;&lt;span&gt;postData = &lt;/span&gt;&lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;NameValueCollection&lt;/span&gt;&lt;span&gt;();
    postData.Add(&lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;__CALLBACKID&amp;quot;&lt;/span&gt;&lt;span&gt;, sender);
    postData.Add(&lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;__CALLBACKPARAM&amp;quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;&lt;span&gt;.argument.Text);

    Context.Items[&lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;callbackPostData&amp;quot;&lt;/span&gt;&lt;span&gt;] = postData;

    &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Page &lt;/span&gt;&lt;span&gt;calledPage = (&lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Page&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style="color:#2b91af;"&gt;PageParser&lt;/span&gt;&lt;span&gt;.GetCompiledPageInstance(&lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;~/Callback1.aspx&amp;quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;&lt;span&gt;.Server.MapPath(&lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;~/Callback1.aspx&amp;quot;&lt;/span&gt;&lt;span&gt;), &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;&lt;span&gt;.Context);

    &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;&lt;span&gt;.Context.Handler = calledPage;

    &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;StringWriter &lt;/span&gt;&lt;span&gt;writer = &lt;/span&gt;&lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;StringWriter&lt;/span&gt;&lt;span&gt;();

    Server.Execute(calledPage, writer, &lt;/span&gt;&lt;span style="color:blue;"&gt;false&lt;/span&gt;&lt;span&gt;);

    &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;&lt;span&gt;.response.Text = writer.ToString();
}
&lt;/span&gt;&lt;span style="color:blue;"&gt;finally
&lt;/span&gt;&lt;span&gt;{
    &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;&lt;span&gt;.Context.Handler = handler;
}
&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 align="justify"&gt;You can find an implementation of a caller and a called page &lt;a title="How To Issue Server Callbacks - Source Code" href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=PauloMorgado&amp;amp;DownloadId=4176" target="_blank"&gt;here&lt;/a&gt;.&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=1656740" width="1" height="1"&gt;</description><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/Web/default.aspx">Web</category></item><item><title>PDC2008: Is My House On The Cloud Or Is The Cloud In My House?</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/10/19/pdc2008-is-my-house-on-the-cloud-or-is-the-cloud-in-my-house.aspx</link><pubDate>Sun, 19 Oct 2008 17:41:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1651314</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=1651314</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1651314</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/10/19/pdc2008-is-my-house-on-the-cloud-or-is-the-cloud-in-my-house.aspx#comments</comments><description>&lt;p align="justify"&gt;This year’s &lt;a title="Microsoft PDC" target="_blank" href="http://microsoftpdc.com/"&gt;PDC&lt;/a&gt; is mostly about the &lt;strong&gt;cloud&lt;/strong&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;Everyone is talking about the &lt;strong&gt;cloud&lt;/strong&gt;: &lt;strong&gt;cloud&lt;/strong&gt; services, &lt;strong&gt;cloud&lt;/strong&gt; computing, etc. but I’m not sure everyone has the same understanding of what the &lt;strong&gt;cloud&lt;/strong&gt; is. Let’s say it’s a &lt;strong&gt;cloudy&lt;/strong&gt; concept.&lt;/p&gt;
&lt;p align="justify"&gt;So, what is this &lt;strong&gt;cloud&lt;/strong&gt; thing, anyway?&lt;/p&gt;
&lt;p align="justify"&gt;Let’s take&amp;nbsp;&lt;a title="Microsoft Windows Home Server" target="_blank" href="https://www.microsoft.com/windows/products/winfamily/windowshomeserver/"&gt;Windows Home Server&lt;/a&gt; (WHS) as an example. &lt;a title="Microsoft Corporation" target="_blank" href="http://www.microsoft.com/"&gt;Microsoft&lt;/a&gt; provides a set of services through &lt;a target="_blank" href="http://homeserver.com/"&gt;homeserver.com&lt;/a&gt; that allows me to control my home server and access my other PCs in the home network. I guess I could say that &lt;strong&gt;homeserver.com&lt;/strong&gt; is a &lt;strong&gt;cloud platform&lt;/strong&gt; that puts my house in the &lt;strong&gt;cloud&lt;/strong&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;On the other hand, WHS is built on top of &lt;a title="Windows Server 2003" target="_blank" href="http://www.microsoft.com/windowsserver2003/"&gt;Windows Server 2003&lt;/a&gt; which allows me to take full advantage of its web server (&lt;a title="IIS.net : The Official Microsoft IIS Site" target="_blank" href="http://www.iis.net/"&gt;IIS&lt;/a&gt;) to expose services through &lt;strong&gt;homeserver.com&lt;/strong&gt;. Services that could be for my personal use or that I could provide to others, thus putting my house on the &lt;strong&gt;cloud&lt;/strong&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;At a larger scale, that’s how I see the &lt;strong&gt;cloud&lt;/strong&gt; and it’s usage. An indistinct universe of service providers and service consumers where some are just providers, others are just consumers and others are both (service aggregators, value added brokers, etc.)&lt;/p&gt;
&lt;p align="justify"&gt;I guess that Microsoft’s view in regards to the &lt;strong&gt;cloud&lt;/strong&gt; and WHS is aligned with mine because there will be two PDC sessions about this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;&lt;a href="http://channel9.msdn.com/pdc2008/ES11/"&gt;Developing Connected Home Applications and Services for Windows Home Server&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;Tue 10/28 | 5:15 PM-6:30 PM | 409A&lt;/div&gt;
&lt;div&gt;Presenter(s): CJ Saretto, Fabian Uhse&lt;/div&gt;
&lt;p align="justify"&gt;Learn how to build applications and services deployed on Windows Home Server that power PCs and devices throughout a connected home. See an example home automation and energy management service, and watch the creation of an on-premises service that exposes HVAC, window shades, and lighting controls to all devices on the home network. Hear how to package the service as a Windows Home Server add-in, quickly create a configuration UI, deploy a PC application for controlling the service, and demonstrate control from other devices such as TVs and cell phones.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div align="left"&gt;&lt;a href="http://channel9.msdn.com/pdc2008/ES12/"&gt;Exposing Connected Home Services to the Internet via Windows Home Server&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;Wed 10/29 | 10:30 AM-11:45 AM | 409A&lt;/div&gt;
&lt;div&gt;Presenter(s): Brendan Grant, CJ Saretto&lt;/div&gt;
&lt;p align="justify"&gt;Learn how to leverage the Remote Access platform in Windows Home Server to expose on-premises services running in the connected home to the Internet. See how to expose a home automation service running on Windows Home Server to the Internet, and watch a demonstration that shows how to expose services that may be hosted on other devices inside the connected home using Windows Home Server as a gateway. Finally, see a sneak preview of Home Server and Live Mesh working together to further enhance the remote experience for the connected home.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;
Windows Home Server Resources
&lt;ul&gt;
&lt;li&gt;&lt;a title="Microsoft Windows Home Server" target="_blank" href="https://www.microsoft.com/windows/products/winfamily/windowshomeserver/"&gt;Windows Home Server&lt;/a&gt; 
&lt;div align="justify"&gt;Microsoft Windows Home Server Home Page&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="An online bulletin board resource for families with &amp;quot;Stay-At-Home&amp;quot; Servers" target="_blank" href="http://www.stayathomeserver.com/"&gt;&amp;quot;Stay-At-Home&amp;quot; Server Neighbor Networks&lt;/a&gt; 
&lt;div align="justify"&gt;An online bulletin board resource for families with &amp;quot;Stay-At-Home&amp;quot; Servers&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="Windows Home Server &amp;amp; Your Digital Home" target="_blank" href="http://www.wegotserved.co.uk/"&gt;We Got Served&lt;/a&gt; 
&lt;div align="justify"&gt;Windows Home Server &amp;amp; Your Digital Home&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; 
&lt;p align="justify"&gt;And, suddenly, a cloud in your future is not a ad thing, quite the opposite.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1651314" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Events/default.aspx">Events</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/Windows/default.aspx">Windows</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/PDC/default.aspx">PDC</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/WindowsHomeServer/default.aspx">WindowsHomeServer</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/PDC2008/default.aspx">PDC2008</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Cloud/default.aspx">Cloud</category></item><item><title>PDC2008: Are Windows Forms Dead?</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/10/09/pdc2008-are-windows-forms-dead.aspx</link><pubDate>Thu, 09 Oct 2008 00:33:59 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1650227</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=1650227</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1650227</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/10/09/pdc2008-are-windows-forms-dead.aspx#comments</comments><description>&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p&gt;This year’s &lt;a title="Microsoft PDC" href="http://microsoftpdc.com/" target="_blank"&gt;PDC&lt;/a&gt; is all about the cloud (or cloudy as I call it) and the &lt;a title=".NET Framework Developer Center" href="http://msdn.microsoft.com/netframework/" target="_blank"&gt;.NET Framework&lt;/a&gt; 4.0.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p&gt;No one at &lt;a title="Microsoft Corporation" href="http://www.microsoft.com/" target="_blank"&gt;Microsoft&lt;/a&gt; has ever told me that &lt;a title="Windows Forms" href="http://msdn.microsoft.com/netframework/aa497342.aspx" target="_blank"&gt;Windows Forms&lt;/a&gt; are dead (quite the opposite) but looking at the list of &lt;a title="PDC 2008 / Agenda /Sessions" href="https://sessions.microsoftpdc.com/public/sessions.aspx" target="_blank"&gt;sessions&lt;/a&gt; for this year’s PDC I can only see &lt;a title="Windows Presentation Foundation" href="http://msdn.microsoft.com/library/ms754130.aspx" target="_blank"&gt;WPF&lt;/a&gt;.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p&gt;So the question remains: &lt;strong&gt;Are Windows Forms dead?&lt;/strong&gt;&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=1650227" 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/Events/default.aspx">Events</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/WindowsClient/default.aspx">WindowsClient</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/PDC/default.aspx">PDC</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/PDC2008/default.aspx">PDC2008</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/WindowsForms/default.aspx">WindowsForms</category></item><item><title>Typemock Isolator 5.1 Released</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/10/06/typemock-isolator-5-1-released.aspx</link><pubDate>Mon, 06 Oct 2008 22:41:57 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1649936</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=1649936</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1649936</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/10/06/typemock-isolator-5-1-released.aspx#comments</comments><description>&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p&gt;This major version adds static method support and non-public method faking to the AAA API. Check out the &lt;a title="Typemock Isolator 5.1 Released!" href="http://blog.typemock.com/2008/09/typemock-isolator-51-released.html" target="_blank"&gt;release notes&lt;/a&gt;.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p&gt;I don’t like the reflective approach to testing private methods.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p&gt;With the new additions to the AAA API, testing 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 class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;MyClass
&lt;/span&gt;{
    &lt;span style="color:blue;"&gt;public string &lt;/span&gt;Public()
    {
        &lt;span style="color:blue;"&gt;return this&lt;/span&gt;.Private();
    }

    &lt;span style="color:blue;"&gt;private string &lt;/span&gt;Private()
    {
        &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;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p&gt;can be done like this:&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;pre class="code"&gt;[&lt;span style="color:#2b91af;"&gt;TestMethod&lt;/span&gt;]
[&lt;span style="color:#2b91af;"&gt;Isolated&lt;/span&gt;]
&lt;span style="color:blue;"&gt;public void &lt;/span&gt;PrivateTest()
{
    &lt;span style="color:#2b91af;"&gt;MyClass &lt;/span&gt;fake = &lt;span style="color:#2b91af;"&gt;Isolate&lt;/span&gt;.Fake.Instance&amp;lt;&lt;span style="color:#2b91af;"&gt;MyClass&lt;/span&gt;&amp;gt;();

    &lt;span style="color:#2b91af;"&gt;Isolate&lt;/span&gt;.WhenCalled(() =&amp;gt; fake.Public()).CallOriginal();

    &lt;span style="color:#2b91af;"&gt;Isolate&lt;/span&gt;.NonPublic.WhenCalled(fake, &lt;span style="color:#a31515;"&gt;&amp;quot;Private&amp;quot;&lt;/span&gt;).WillReturn(&lt;span style="color:#a31515;"&gt;&amp;quot;FAKE&amp;quot;&lt;/span&gt;);

    &lt;span style="color:blue;"&gt;string &lt;/span&gt;fakePublic = fake.Public();

    &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:#a31515;"&gt;&amp;quot;FAKE&amp;quot;&lt;/span&gt;, fakePublic);

    &lt;span style="color:#2b91af;"&gt;Isolate&lt;/span&gt;.Verify.WasCalledWithExactArguments(() =&amp;gt; fake.Public());

    &lt;span style="color:#2b91af;"&gt;Isolate&lt;/span&gt;.Verify.NonPublic.WasCalled(fake, &lt;span style="color:#a31515;"&gt;&amp;quot;Private&amp;quot;&lt;/span&gt;);
}&lt;/pre&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p&gt;I would like it better if it was like this:&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;pre class="code"&gt;[&lt;span style="color:#2b91af;"&gt;TestMethod&lt;/span&gt;]
[&lt;span style="color:#2b91af;"&gt;Isolated&lt;/span&gt;]
&lt;span style="color:blue;"&gt;public void &lt;/span&gt;PrivateTest()
{
    &lt;span style="color:#2b91af;"&gt;MyClass &lt;/span&gt;fake = &lt;span style="color:#2b91af;"&gt;Isolate&lt;/span&gt;.Fake.Instance&amp;lt;&lt;span style="color:#2b91af;"&gt;MyClass&lt;/span&gt;&amp;gt;();

    &lt;span style="color:#2b91af;"&gt;MyClass_Accessor &lt;/span&gt;fakeAccessor = &lt;span style="color:#2b91af;"&gt;MyClass_Accessor&lt;/span&gt;.AttachShadow(fake);

    &lt;span style="color:#2b91af;"&gt;Isolate&lt;/span&gt;.WhenCalled(() =&amp;gt; fakeAccessor.Private()).WillReturn(&lt;span style="color:#a31515;"&gt;&amp;quot;FAKE&amp;quot;&lt;/span&gt;);

    &lt;span style="color:#2b91af;"&gt;Isolate&lt;/span&gt;.WhenCalled(() =&amp;gt; fake.Public()).CallOriginal();

    &lt;span style="color:blue;"&gt;string &lt;/span&gt;fakePublic = fake.Public();

    &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:#a31515;"&gt;&amp;quot;FAKE&amp;quot;&lt;/span&gt;, fakePublic);

    &lt;span style="color:#2b91af;"&gt;Isolate&lt;/span&gt;.Verify.WasCalledWithExactArguments(() =&amp;gt; fake.Public());

    &lt;span style="color:#2b91af;"&gt;Isolate&lt;/span&gt;.Verify.WasCalledWithExactArguments(() =&amp;gt; fakeAccessor.Private());
}&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;Looks almost the same but there aren’t any method names in the test code.&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p&gt;They were able to do it for Natural Mocks. I’m sure they will eventually do it for AAA.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1649936" 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/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/UnitTests/default.aspx">UnitTests</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/TypeMock/default.aspx">TypeMock</category></item><item><title>Faking Output Parameters With Typemock Isolator</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/10/06/faking-output-parameters-with-typemock-isolator.aspx</link><pubDate>Mon, 06 Oct 2008 20:51:40 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1649919</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=1649919</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1649919</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/10/06/faking-output-parameters-with-typemock-isolator.aspx#comments</comments><description>&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p&gt;Some time ago I was &lt;a title="Unit Testing and Mock Frameworks" href="http://msmvps.com/blogs/paulomorgado/archive/2007/02/17/unit-testing-and-mock-frameworks.aspx#1648003" target="_blank"&gt;asked&lt;/a&gt; if it was possible to fake output parameters with &lt;a title="Typemock - Simplify Unit Testing!" href="http://www.typemock.com/" target="_blank"&gt;&lt;/a&gt;&lt;a title="Typemock Isolator - Serious Development" href="http://www.typemock.com/Product.html" target="_blank"&gt;Typemock Isolator&lt;/a&gt;.&lt;/a&gt;&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p&gt;It’s actually very easy using any of the APIs.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p&gt;Given this class:&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;pre class="code"&gt;&lt;span style="color:#0000ff;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;MyClass
&lt;/span&gt;{
    &lt;span style="color:#0000ff;"&gt;public bool &lt;/span&gt;MyMethod(&lt;span style="color:#0000ff;"&gt;string &lt;/span&gt;input, &lt;span style="color:#0000ff;"&gt;out int &lt;/span&gt;output1, &lt;span style="color:#0000ff;"&gt;out double &lt;/span&gt;output2)
    {
        &lt;span style="color:#0000ff;"&gt;throw new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;NotImplementedException&lt;/span&gt;();
    }
}&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using the new AAA API, it&amp;#39;s as clean as:&lt;/p&gt;

&lt;pre class="code"&gt;[&lt;span style="color:#2b91af;"&gt;TestMethod&lt;/span&gt;]
[&lt;span style="color:#2b91af;"&gt;Isolated&lt;/span&gt;]
&lt;span style="color:blue;"&gt;public void &lt;/span&gt;TestMethodIsolated()
{
    &lt;span style="color:#2b91af;"&gt;MyClass &lt;/span&gt;target = &lt;span style="color:#2b91af;"&gt;Isolate&lt;/span&gt;.Fake.Instance&amp;lt;&lt;span style="color:#2b91af;"&gt;MyClass&lt;/span&gt;&amp;gt;();

    &lt;span style="color:blue;"&gt;string &lt;/span&gt;input = &lt;span style="color:#a31515;"&gt;&amp;quot;test value&amp;quot;&lt;/span&gt;;
    &lt;span style="color:blue;"&gt;int &lt;/span&gt;expectedOutput1 = 1;
    &lt;span style="color:blue;"&gt;double &lt;/span&gt;expectedOutput2 = 2;

    &lt;span style="color:#2b91af;"&gt;Isolate&lt;/span&gt;.WhenCalled(() =&amp;gt; target.MyMethod(input, &lt;span style="color:blue;"&gt;out &lt;/span&gt;expectedOutput1, &lt;span style="color:blue;"&gt;out &lt;/span&gt;expectedOutput2)).WillReturn(&lt;span style="color:blue;"&gt;true&lt;/span&gt;);

    &lt;span style="color:blue;"&gt;int &lt;/span&gt;output1;
    &lt;span style="color:blue;"&gt;double &lt;/span&gt;output2;
    &lt;span style="color:blue;"&gt;bool &lt;/span&gt;result = target.MyMethod(input, &lt;span style="color:blue;"&gt;out &lt;/span&gt;output1, &lt;span style="color:blue;"&gt;out &lt;/span&gt;output2);

    &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.IsTrue(result);
    &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual&amp;lt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;gt;(expectedOutput1, output1);
    &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual&amp;lt;&lt;span style="color:blue;"&gt;double&lt;/span&gt;&amp;gt;(expectedOutput2, output2);
}&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;Using Natural Mocks, it&amp;#39;s as easy as:&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;pre class="code"&gt;[&lt;span style="color:#2b91af;"&gt;TestMethod&lt;/span&gt;]
[&lt;span style="color:#2b91af;"&gt;VerifyMocks&lt;/span&gt;]
&lt;span style="color:#0000ff;"&gt;public void &lt;/span&gt;TestMethodNatural()
{
    &lt;span style="color:#2b91af;"&gt;MyClass &lt;/span&gt;target = &lt;span style="color:#2b91af;"&gt;RecorderManager&lt;/span&gt;.CreateMockedObject&amp;lt;&lt;span style="color:#2b91af;"&gt;MyClass&lt;/span&gt;&amp;gt;();

    &lt;span style="color:#0000ff;"&gt;string &lt;/span&gt;input = &lt;span style="color:#a31515;"&gt;&amp;quot;test value&amp;quot;&lt;/span&gt;;
    &lt;span style="color:#0000ff;"&gt;int &lt;/span&gt;expectedOutput1 = 1;
    &lt;span style="color:#0000ff;"&gt;double &lt;/span&gt;expectedOutput2 = 2;

    &lt;span style="color:#0000ff;"&gt;using &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;RecordExpectations &lt;/span&gt;recorder = &lt;span style="color:#2b91af;"&gt;RecorderManager&lt;/span&gt;.StartRecording())
    {
        recorder.ExpectAndReturn(target.MyMethod(input, &lt;span style="color:#0000ff;"&gt;out &lt;/span&gt;expectedOutput1, &lt;span style="color:#0000ff;"&gt;out &lt;/span&gt;expectedOutput2), &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;);
    }

    &lt;span style="color:#0000ff;"&gt;int &lt;/span&gt;output1;
    &lt;span style="color:#0000ff;"&gt;double &lt;/span&gt;output2;
    &lt;span style="color:#0000ff;"&gt;bool &lt;/span&gt;result = target.MyMethod(input, &lt;span style="color:#0000ff;"&gt;out &lt;/span&gt;output1, &lt;span style="color:#0000ff;"&gt;out &lt;/span&gt;output2);

    &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.IsTrue(result);
    &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual&amp;lt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&amp;gt;(expectedOutput1, output1);
    &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual&amp;lt;&lt;span style="color:#0000ff;"&gt;double&lt;/span&gt;&amp;gt;(expectedOutput2, output2);
}&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;It&amp;#39;s also possible using Reflective Mocks:&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;pre class="code"&gt;[&lt;span style="color:#2b91af;"&gt;TestMethod&lt;/span&gt;]
[&lt;span style="color:#2b91af;"&gt;VerifyMocks&lt;/span&gt;]
&lt;span style="color:#0000ff;"&gt;public void &lt;/span&gt;TestMethodReflective()
{
    &lt;span style="color:#2b91af;"&gt;MockObject&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;MyClass&lt;/span&gt;&amp;gt; targetMock = &lt;span style="color:#2b91af;"&gt;MockManager&lt;/span&gt;.MockObject&amp;lt;&lt;span style="color:#2b91af;"&gt;MyClass&lt;/span&gt;&amp;gt;();

    &lt;span style="color:#0000ff;"&gt;string &lt;/span&gt;input = &lt;span style="color:#a31515;"&gt;&amp;quot;test value&amp;quot;&lt;/span&gt;;
    &lt;span style="color:#0000ff;"&gt;int &lt;/span&gt;expectedOutput1 = 1;
    &lt;span style="color:#0000ff;"&gt;double &lt;/span&gt;expectedOutput2 = 2;

    targetMock.ExpectAndReturn(
        &lt;span style="color:#a31515;"&gt;&amp;quot;MyMethod&amp;quot;&lt;/span&gt;,
        &lt;span style="color:#0000ff;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;DynamicReturnValue&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;[] parameters, &lt;span style="color:#0000ff;"&gt;object &lt;/span&gt;context)
            {
                parameters[1] = expectedOutput1;
                parameters[2] = expectedOutput2;
                &lt;span style="color:#0000ff;"&gt;return true&lt;/span&gt;;
            }));

    &lt;span style="color:#0000ff;"&gt;int &lt;/span&gt;output1;
    &lt;span style="color:#0000ff;"&gt;double &lt;/span&gt;output2;
    &lt;span style="color:#0000ff;"&gt;bool &lt;/span&gt;result = targetMock.Object.MyMethod(input, &lt;span style="color:#0000ff;"&gt;out &lt;/span&gt;output1, &lt;span style="color:#0000ff;"&gt;out &lt;/span&gt;output2);

    &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.IsTrue(result);
    &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual&amp;lt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&amp;gt;(expectedOutput1, output1);
    &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual&amp;lt;&lt;span style="color:#0000ff;"&gt;double&lt;/span&gt;&amp;gt;(expectedOutput2, output2);
}&lt;/pre&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p&gt;All you have to do is choose which one you like most.&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=1649919" 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/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/UnitTests/default.aspx">UnitTests</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/TypeMock/default.aspx">TypeMock</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>PDC2008: Meet Me In Los Angeles</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/09/04/pdc2008-meet-me-in-los-angeles.aspx</link><pubDate>Thu, 04 Sep 2008 00:23:28 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1646687</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1646687</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1646687</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/09/04/pdc2008-meet-me-in-los-angeles.aspx#comments</comments><description>&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="center"&gt;&lt;a title="Microsoft PDC" href="http://microsoftpdc.com/" target="_blank"&gt;&lt;img src="http://microsoftpdc.com/Images/Wallpapers/frenetic_multi_thumb.jpg" alt="" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;It’s not the first time I try but, for one reason or another, this is the first time I will go to the &lt;a title="Microsoft PDC" href="http://microsoftpdc.com/" target="_blank"&gt;PDC&lt;/a&gt; (&lt;a title="Microsoft Corporation" href="http://www.microsoft.com/" target="_blank"&gt;Microsoft&lt;/a&gt;’s Professional Developers Conference).&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;According to the site “The PDC is designed for leading-edge developers and software architects. If you’re interested in the future of the Microsoft platform, you’re responsible for the technical strategy in your organization, or you’re a highly skilled developer who likes to delve deep into the heart of the platform, then the PDC is for you!”. If you fit this description, hurry up and register. Early bird discount has been extended until September 8&lt;sup&gt;th&lt;/sup&gt;.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;What I like most of these events is networking with Microsoft staff and other attendees. So, if you want to meet me, I’ll be glad to meet you.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1646687" 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/Events/default.aspx">Events</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/PDC/default.aspx">PDC</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/PDC2008/default.aspx">PDC2008</category></item><item><title>Clone Detective For Visual Studio</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/08/28/clone-detective-for-visual-studio.aspx</link><pubDate>Thu, 28 Aug 2008 22:41:36 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1646133</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=1646133</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1646133</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/08/28/clone-detective-for-visual-studio.aspx#comments</comments><description>&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="center"&gt;&lt;a title="Clone Detective for Visual Studio" href="http://www.codeplex.com/CloneDetectiveVS" target="_blank"&gt;&lt;img title="Clone Detective for Visual Studio" alt="Clone Detective for Visual Studio" src="http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=CloneDetectiveVS&amp;amp;DownloadId=41494" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;&lt;a title="Clone Detective for Visual Studio" href="http://www.codeplex.com/CloneDetectiveVS" target="_blank"&gt;Clone Detective&lt;/a&gt; is a tool that integrates with &lt;a title="Microsoft Visual Studio" href="http://msdn.microsoft.com/vstudio/" target="_blank"&gt;Visual Studio&lt;/a&gt; and uses the &lt;a title="ConQAT (Continuous Quality Assessment Toolkit)" href="http://conqat.cs.tum.edu/" target="_blank"&gt;ConQAT&lt;/a&gt; (&lt;strong&gt;Con&lt;/strong&gt;tinuous &lt;strong&gt;Q&lt;/strong&gt;uality &lt;strong&gt;A&lt;/strong&gt;ssessment &lt;strong&gt;T&lt;/strong&gt;oolkit) to analyze &lt;a title="Visual C#" href="http://msdn.microsoft.com/vcsharp/" target="_blank"&gt;C#&lt;/a&gt; projects and search for duplicated source code.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;Watch the &lt;a title="Clone Detective Videos" href="http://www.codeplex.com/CloneDetectiveVS/Wiki/View.aspx?title=Videos" target="_blank"&gt;videos&lt;/a&gt; and see if this is the tool you were looking for.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1646133" 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/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/CodePlex/default.aspx">CodePlex</category></item><item><title>StyleCop 4.3 Is Out</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/08/21/stylecop-4-3-is-out.aspx</link><pubDate>Wed, 20 Aug 2008 23:36:21 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1645290</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=1645290</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1645290</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/08/21/stylecop-4-3-is-out.aspx#comments</comments><description>&lt;a&gt;&lt;/a&gt;  &lt;p&gt;The &lt;a title="Microsoft StyleCop" href="http://blogs.msdn.com/sourceanalysis/" target="_blank"&gt;StyleCop team&lt;/a&gt; &lt;a title="StyleCop 4.3 Is Released" href="http://blogs.msdn.com/sourceanalysis/archive/2008/08/19/stylecop-4-3-is-released.aspx" target="_blank"&gt;announced&lt;/a&gt; the release of a version 4.3 of the &lt;a title="Microsoft StyleCop" href="http://code.msdn.microsoft.com/sourceanalysis" target="_blank"&gt;StyleCop tool&lt;/a&gt;. You can get it from &lt;a title="StyleCop 4.3" href="http://code.msdn.microsoft.com/Release/ProjectReleases.aspx?ProjectName=sourceanalysis&amp;amp;ReleaseId=1425" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;a&gt;&lt;/a&gt;  &lt;p&gt;On this version there are some bug fixes, new rules and documentation.&lt;/p&gt; &lt;a&gt;&lt;/a&gt;  &lt;p&gt;Also in this version, the list of errors and warnings goes to the &lt;strong&gt;Errors List&lt;/strong&gt; window like with the compilers. I whish that the errors and warnings would also be sent to the &lt;strong&gt;Output&lt;/strong&gt; window.&lt;/p&gt; &lt;a&gt;&lt;/a&gt;  &lt;p&gt;SDK documentation on how to author custom rules and integrate the tool with custom build environments is expected soon.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1645290" 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/Tools/default.aspx">Tools</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/CodingConventions/default.aspx">CodingConventions</category></item><item><title>Lutz Roeder’s .NET Reflector Is Now Red Gate’s .NET Reflector</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/08/20/lutz-roeder-s-net-reflector-is-now-red-gate-s-net-reflector.aspx</link><pubDate>Wed, 20 Aug 2008 22:34:29 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1645285</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=1645285</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1645285</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/08/20/lutz-roeder-s-net-reflector-is-now-red-gate-s-net-reflector.aspx#comments</comments><description>&lt;a&gt;&lt;/a&gt;  &lt;p&gt;Let’s face it, if you don’t know &lt;a title=".NET Framework Developer Center" href="http://msdn.microsoft.com/netframework/" target="_blank"&gt;.NET&lt;/a&gt; Reflector, you can never claim to be a .NET developer.&lt;/p&gt; &lt;a&gt;&lt;/a&gt;  &lt;p&gt;Today &lt;a title="redgate - ingeniously simple tools" href="http://www.red-gate.com/" target="_blank"&gt;Red Gate&lt;/a&gt; announced the acquisition of Lutz Roeder’s .NET Reflector.&lt;/p&gt; &lt;a&gt;&lt;/a&gt;  &lt;p&gt;On &lt;a title=".NET Reflector" href="http://reflector.red-gate.com/" target="_blank"&gt;.NET Reflector&lt;/a&gt;’s page, Red Gate states that “will continue to &lt;strong&gt;maintain a free version for the benefit of the community&lt;/strong&gt;”.&lt;/p&gt; &lt;a&gt;&lt;/a&gt;  &lt;p&gt;You can read an &lt;a title="The Future of Reflector" href="http://www.simple-talk.com/opinion/opinion-pieces/the-future-of-reflector-/" target="_blank"&gt;interview&lt;/a&gt; with Lutz Roeder and James Moore (general manager of .NET Developer Tools at Red Gate) at &lt;a title="simple-talk - SQL Server and .NET put simply" href="http://www.simple-talk.com/" target="_blank"&gt;simple-talk&lt;/a&gt;.&lt;/p&gt; &lt;a&gt;&lt;/a&gt;  &lt;p&gt;James doesn’t know yet how to improve &lt;a title="Reflector for .NET" href="http://www.aisto.com/roeder/dotnet/" target="_blank"&gt;Reflector&lt;/a&gt;, but I do. Reflector needs a major improvement on UI usability and performance. Let’s see if I can come up with a list:&lt;/p&gt; &lt;a&gt;&lt;/a&gt;  &lt;ul&gt;   &lt;li&gt;For me, search as you type is not a good idea as it is in Reflector. &lt;/li&gt;    &lt;li&gt;Still in the search theme, search as you type would be nice for the active code window. &lt;/li&gt;    &lt;li&gt;I cannot understand why changing any of the options fires a total repaint and lost of the view of the active code item. &lt;/li&gt;    &lt;li&gt;Settings like code, documentation and number formatting should possible to change on the fly with a simple toolbar click. &lt;/li&gt; &lt;/ul&gt; &lt;a&gt;&lt;/a&gt;  &lt;p&gt;I’m sure Red Gate is more than capable of taking good care of .NET Reflector.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1645285" 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/Tools/default.aspx">Tools</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/redgate/default.aspx">redgate</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Reflector/default.aspx">Reflector</category></item></channel></rss>