<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Technetguy.com/blog</title><subtitle type="html">A way to communicate and learn .Net</subtitle><id>http://weblogs.asp.net/robertxue/atom.aspx</id><link rel="alternate" type="text/html" href="http://weblogs.asp.net/robertxue/default.aspx" /><link rel="self" type="application/atom+xml" href="http://weblogs.asp.net/robertxue/atom.aspx" /><generator uri="http://communityserver.org" version="3.0.20510.895">Community Server</generator><updated>2008-11-10T15:53:53Z</updated><entry><title>BING is live, the msn search is gone.</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/robertxue/archive/2009/06/01/bing-is-live-the-msn-search-is-gone.aspx" /><id>http://weblogs.asp.net/robertxue/archive/2009/06/01/bing-is-live-the-msn-search-is-gone.aspx</id><published>2009-06-01T21:07:27Z</published><updated>2009-06-01T21:07:27Z</updated><content type="html">Watched the live video of the BING, I really liked the idea about the categorized search result. Also found that http://search.msn.com is already redirected to the http://www.bing.com &amp;#160; Also noticed a unofficial definition of the BING&amp;#160; -- :-)&amp;#160; &amp;quot;BING = But its not Google&amp;quot; It’s interesting that Microsoft is taking the social media like Twitter to do the release announcement as well....(&lt;a href="http://weblogs.asp.net/robertxue/archive/2009/06/01/bing-is-live-the-msn-search-is-gone.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7105329" width="1" height="1"&gt;</content><author><name>RobertNet</name><uri>http://weblogs.asp.net/members/RobertNet.aspx</uri></author><category term="BING" scheme="http://weblogs.asp.net/robertxue/archive/tags/BING/default.aspx" /></entry><entry><title>WCF RESTFul Service</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/robertxue/archive/2009/04/12/wcf-restful-service.aspx" /><id>http://weblogs.asp.net/robertxue/archive/2009/04/12/wcf-restful-service.aspx</id><published>2009-04-12T04:17:04Z</published><updated>2009-04-12T04:17:04Z</updated><content type="html">Creating a RESTFul web service in WCF can be easier than a normal web service!? Some of my friends did not believe and they even argued that REST is not considered as a web service.So I figured it out by using the http://en.wikipedia.org/wiki/Web_service . Thanks wikipedia! With the installation of the WCF REST Service Start Kit , the RESTFul web service can be created by using a wizard and you can create multi types of service as well.Before you install this start kit, you have to install the visual...(&lt;a href="http://weblogs.asp.net/robertxue/archive/2009/04/12/wcf-restful-service.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7044394" width="1" height="1"&gt;</content><author><name>RobertNet</name><uri>http://weblogs.asp.net/members/RobertNet.aspx</uri></author><category term="Asp.Net" scheme="http://weblogs.asp.net/robertxue/archive/tags/Asp.Net/default.aspx" /><category term="REST" scheme="http://weblogs.asp.net/robertxue/archive/tags/REST/default.aspx" /></entry><entry><title>LINQ to Flickr support for Photo search</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/robertxue/archive/2009/04/04/linq-to-flickr-support-for-photo-search.aspx" /><id>http://weblogs.asp.net/robertxue/archive/2009/04/04/linq-to-flickr-support-for-photo-search.aspx</id><published>2009-04-05T03:06:00Z</published><updated>2009-04-05T03:06:00Z</updated><content type="html">Long time ago, I had one post said that the NFlickr is going to support the LINQ , because my new baby was born at last Dec and I could not get any chance until yesterday. So NOW I will announce that the first version of the LINQ to Flickr is ready for the Alpha test. To search your photos can be as simple as this 1: PhotoList list = new PhotoList(service); 2: var photos = from photo in list 3: where photo.TagName == "Yang" &amp;amp;&amp;amp; photo.Family == true 4: select photo; .csharpcode, .csharpcode...(&lt;a href="http://weblogs.asp.net/robertxue/archive/2009/04/04/linq-to-flickr-support-for-photo-search.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7025866" width="1" height="1"&gt;</content><author><name>RobertNet</name><uri>http://weblogs.asp.net/members/RobertNet.aspx</uri></author><category term="LINQ" scheme="http://weblogs.asp.net/robertxue/archive/tags/LINQ/default.aspx" /></entry><entry><title>The problem of JSON and how to fix it(Update with code sample)</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/robertxue/archive/2008/11/17/the-problem-of-json-and-how-to-fix-it.aspx" /><id>http://weblogs.asp.net/robertxue/archive/2008/11/17/the-problem-of-json-and-how-to-fix-it.aspx</id><published>2008-11-18T04:39:00Z</published><updated>2008-11-18T04:39:00Z</updated><content type="html">In AJAX world, JSON is one of the most popular implementation, Asp.Net AJAX is using this concept, and it really works great. But in some very special situation, JSON could cause some unexpected problems.For example, if the user want to submit a huge document on the local to the server side, you will find it takes too much time before the server-side gets requested.Why? We knew that one task for the so-call AJAX framework is to serialize the data and on the server-side to de-serialize the data. But...(&lt;a href="http://weblogs.asp.net/robertxue/archive/2008/11/17/the-problem-of-json-and-how-to-fix-it.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6744858" width="1" height="1"&gt;</content><author><name>RobertNet</name><uri>http://weblogs.asp.net/members/RobertNet.aspx</uri></author><category term="Asp.Net" scheme="http://weblogs.asp.net/robertxue/archive/tags/Asp.Net/default.aspx" /><category term="AJAX" scheme="http://weblogs.asp.net/robertxue/archive/tags/AJAX/default.aspx" /></entry><entry><title>Multi culture programming in Asp.Net</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/robertxue/archive/2008/11/16/multi-culture-programming-in-asp-net.aspx" /><id>http://weblogs.asp.net/robertxue/archive/2008/11/16/multi-culture-programming-in-asp-net.aspx</id><published>2008-11-16T06:08:00Z</published><updated>2008-11-16T06:08:00Z</updated><content type="html">Asp.Net provide a very powerful multi culture programming pattern.In this post , we will discuss specially under the user control level. Last weekend, one of my friends asked the question about the user control multi culture programming problem. He could not make it work at that time and I was in the middle of the NFlickr Release , so I promised to write a post about this problem. First, I did not know what exactly the problem was, but I will try to use the standard way to implement it. The user...(&lt;a href="http://weblogs.asp.net/robertxue/archive/2008/11/16/multi-culture-programming-in-asp-net.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6743035" width="1" height="1"&gt;</content><author><name>RobertNet</name><uri>http://weblogs.asp.net/members/RobertNet.aspx</uri></author><category term="Asp.Net" scheme="http://weblogs.asp.net/robertxue/archive/tags/Asp.Net/default.aspx" /></entry><entry><title>The first version of the NFlickr released</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/robertxue/archive/2008/11/15/the-first-version-of-the-nflickr-released.aspx" /><id>http://weblogs.asp.net/robertxue/archive/2008/11/15/the-first-version-of-the-nflickr-released.aspx</id><published>2008-11-16T02:41:00Z</published><updated>2008-11-16T02:41:00Z</updated><content type="html">Yesterday, the first Alpha version of the NFlickr was released.This version was fully written by the .Net 3.5 and using the provider concept.For example, if you don't like the built-in encryption or you don't like the implementation of the http communication. you can use the same interface of the provider. From the functionality part, this version will have the below support: 1. Login to the Flickr Service 2. Create the PhotoSet. 3. Upload the photo 4. Add the photo to a photoSet. 5. Search the photo...(&lt;a href="http://weblogs.asp.net/robertxue/archive/2008/11/15/the-first-version-of-the-nflickr-released.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6740603" width="1" height="1"&gt;</content><author><name>RobertNet</name><uri>http://weblogs.asp.net/members/RobertNet.aspx</uri></author></entry><entry><title>Is silverlight application the windows or web?</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/robertxue/archive/2008/11/14/is-silverlight-application-the-windows-or-web.aspx" /><id>http://weblogs.asp.net/robertxue/archive/2008/11/14/is-silverlight-application-the-windows-or-web.aspx</id><published>2008-11-15T04:40:00Z</published><updated>2008-11-15T04:40:00Z</updated><content type="html">Before we started to develop a silverlight application, does anyone ask the question? Is silverlight the windows or web? The short answer is Windows, but wait.... All the code was executed on the client side, the code was download was downloaded to the client side.It has to be executed under the silverlight ActiveX control or browser plugin(For Firefox, Chrome, etc). But why we still call the silverlight as a web application? Because it can interact with the HTML Dom, it can access the IIS by using...(&lt;a href="http://weblogs.asp.net/robertxue/archive/2008/11/14/is-silverlight-application-the-windows-or-web.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6737856" width="1" height="1"&gt;</content><author><name>RobertNet</name><uri>http://weblogs.asp.net/members/RobertNet.aspx</uri></author><category term="Silverlight" scheme="http://weblogs.asp.net/robertxue/archive/tags/Silverlight/default.aspx" /></entry><entry><title>Using the DOM to control the element(TreeView) inside Silverlight</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/robertxue/archive/2008/11/13/using-the-dom-to-control-the-element-treeview-inside-silverlight.aspx" /><id>http://weblogs.asp.net/robertxue/archive/2008/11/13/using-the-dom-to-control-the-element-treeview-inside-silverlight.aspx</id><published>2008-11-14T03:55:49Z</published><updated>2008-11-14T03:55:49Z</updated><content type="html">In our Update the Silverlight toolkit(AutoCompleteBox) With the HTML DOM value post, we talked about the interacting between the Silverlight application and html DOM. It's about using the Silverlight to access the DOM. Today we are going to discuss&amp;#160; using the DOM to access the Silverlight. In the post Using the Silverlight toolkit build a online TreeView , we had a demo application to demo a buddy list tree using the Silverlight toolkit.Today we will wrote a more complex application to update...(&lt;a href="http://weblogs.asp.net/robertxue/archive/2008/11/13/using-the-dom-to-control-the-element-treeview-inside-silverlight.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6734318" width="1" height="1"&gt;</content><author><name>RobertNet</name><uri>http://weblogs.asp.net/members/RobertNet.aspx</uri></author><category term="Silverlight" scheme="http://weblogs.asp.net/robertxue/archive/tags/Silverlight/default.aspx" /></entry><entry><title>Update the Silverlight toolkit(AutoCompleteBox) With the HTML DOM value</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/robertxue/archive/2008/11/13/update-the-silverlight-toolkit-autocompletebox-with-the-html-dom-value.aspx" /><id>http://weblogs.asp.net/robertxue/archive/2008/11/13/update-the-silverlight-toolkit-autocompletebox-with-the-html-dom-value.aspx</id><published>2008-11-13T05:16:00Z</published><updated>2008-11-13T05:16:00Z</updated><content type="html">&lt;p&gt;The silverlight toolkit provided the &lt;a href="http://www.codeplex.com/Silverlight/Wiki/View.aspx?title=Silverlight%20Toolkit%20Overview%20Part%201&amp;amp;referringTitle=Home&amp;amp;ANCHOR#AutoCompleteBox" mce_href="http://www.codeplex.com/Silverlight/Wiki/View.aspx?title=Silverlight%20Toolkit%20Overview%20Part%201&amp;amp;referringTitle=Home&amp;amp;ANCHOR#AutoCompleteBox" target="_blank"&gt;AutoCompleteBox&lt;/a&gt; and We already had one &lt;a href="http://technetguy.com/blog/2008/10/using-the-silverlight-toolkit-to-create-a-web-application/" mce_href="http://technetguy.com/blog/2008/10/using-the-silverlight-toolkit-to-create-a-web-application/" target="_blank"&gt;post&lt;/a&gt; talking about the usage about it.&lt;/p&gt;  &lt;p&gt;This post will focus on the way we can update the content of the AutoCompleteBox by using the value from the HTML DOM value.&lt;/p&gt;  &lt;p&gt;The initialized code was not changed and we only added a new button on the silverlight control which is the &lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="24"&lt;/span&gt; &lt;span class="attr"&gt;HorizontalAlignment&lt;/span&gt;&lt;span class="kwrd"&gt;="Right"&lt;/span&gt; &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;="0,20,123,0"&lt;/span&gt; &lt;span class="attr"&gt;VerticalAlignment&lt;/span&gt;&lt;span class="kwrd"&gt;="Top"&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;="76"&lt;/span&gt; &lt;span class="attr"&gt;Click&lt;/span&gt;&lt;span class="kwrd"&gt;="Button_Click"&lt;/span&gt; &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;="Refresh"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Then we go to the web page ToolboxTestTestPage.aspx to add a new Textarea input box which will provide the content.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;textarea&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;="DataSource"&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="DataSource"&lt;/span&gt; &lt;span class="attr"&gt;cols&lt;/span&gt;&lt;span class="kwrd"&gt;="10"&lt;/span&gt; &lt;span class="attr"&gt;rows&lt;/span&gt;&lt;span class="kwrd"&gt;="5"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;textarea&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;The real problem is about the interacting the silverlight application and the HTML DOM object.&lt;/p&gt;

&lt;p&gt;The first code I tried is to use the common sense way which is &lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;           HtmlElement datasource= HtmlPage.Document.GetElementById(&lt;span class="str"&gt;"DataSource"&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (datasource != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;                &lt;span class="kwrd"&gt;string&lt;/span&gt; content = datasource.GetProperty(&lt;span class="str"&gt;"innerHTML"&lt;/span&gt;) &lt;span class="kwrd"&gt;as&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;                List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; list=content.Split(&lt;span class="str"&gt;"\n"&lt;/span&gt;.ToCharArray()).ToList();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;                txtAutoComplete.ItemsSource = list;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;            }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;But I find it's almost no way for me get the user input value, so I changed my way to using the Javascript.&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;           &lt;span class="kwrd"&gt;string&lt;/span&gt; content = (&lt;span class="kwrd"&gt;string&lt;/span&gt;)HtmlPage.Window.Invoke(&lt;span class="str"&gt;"GetDataSource"&lt;/span&gt;, &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;            List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; list = content.Split(&lt;span class="str"&gt;"\n"&lt;/span&gt;.ToCharArray()).ToList();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            txtAutoComplete.ItemsSource = list;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;i&gt;when I did this , I realized that how cool and convenient will be when we have the C# dynamic.&lt;/i&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;And the Javascript on the page is &lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;ToolboxTest&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="text/javascript"&lt;/span&gt; &lt;span class="attr"&gt;language&lt;/span&gt;&lt;span class="kwrd"&gt;="javascript"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        &lt;span class="kwrd"&gt;function&lt;/span&gt; GetDataSource() {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; $get(&lt;span class="str"&gt;"DataSource"&lt;/span&gt;, document).value;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Keep in mind , don't use the&amp;nbsp; Html.Document.Invoke because the Javascript is an instance of the html window, not the document. In the future post, I will take another way around to getting the silverlight value from the HTML Dom.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6732517" width="1" height="1"&gt;</content><author><name>RobertNet</name><uri>http://weblogs.asp.net/members/RobertNet.aspx</uri></author><category term="Silverlight" scheme="http://weblogs.asp.net/robertxue/archive/tags/Silverlight/default.aspx" /></entry><entry><title>LINQ Tips #7 Create a LINQ to Anything(3)</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/robertxue/archive/2008/11/11/linq-tips-7-create-a-linq-to-anything-3.aspx" /><id>http://weblogs.asp.net/robertxue/archive/2008/11/11/linq-tips-7-create-a-linq-to-anything-3.aspx</id><published>2008-11-12T03:42:27Z</published><updated>2008-11-12T03:42:27Z</updated><content type="html">&lt;p&gt;Yesterday, we implemented a simple LINQ to Objects pattern. In our &lt;a href="http://technetguy.com/blog/2008/11/linq-tips-6-create-a-linq-to-anything2/" target="_blank"&gt;post&lt;/a&gt;, we overwrote the&amp;#160; data source , if you can remember, all the return value were added a tail as &amp;quot;LINQ&amp;quot;.&lt;/p&gt;  &lt;p&gt;But this seems useless, in the &lt;a href="http://www.codeplex.com/NFlickr" target="_blank"&gt;NFlickr&lt;/a&gt; project, we need to send the filter to the Flickr service and get the filtered result.So we need to implement the &amp;quot;Where&amp;quot;&amp;#160; clause.&lt;/p&gt;  &lt;p&gt;Before we start, can you answer the question first?&lt;/p&gt;  &lt;p&gt;If we want to implement the new clause like &amp;quot;Where&amp;quot;,&amp;quot;Orderby&amp;quot;, where we should implement? &lt;/p&gt;  &lt;p&gt;The answer is the method (CreateQuery) for the interface IQueryProvider!&lt;/p&gt;  &lt;p&gt;Yesterday, we only handled the &amp;quot;Select&amp;quot; clause, I will add a new case switch to implement the &amp;quot;Where&amp;quot; condition.&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;            &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Where&amp;quot;&lt;/span&gt;:&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;                            StringBuilder sb = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;                            functions = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;KeyValuePair&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;, Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt;();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;                            filterList = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;                            LambdaExpression lambdaExpression = (LambdaExpression)(((UnaryExpression)callExpression.Arguments[1]).Operand);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;                            ExpandExpression(lambdaExpression.Body);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                            &lt;span class="kwrd"&gt;return&lt;/span&gt; (IQueryable&amp;lt;TElement&amp;gt;)&lt;span class="kwrd"&gt;this&lt;/span&gt;;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;The key point is to cast the callExpression from the Expression to LambdaExpression. After we got the LambdaExpression, we can go inside the method ExpendExpression.&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;        List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; filterList = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ExpandExpression(Expression lambdaExpression)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;            &lt;span class="kwrd"&gt;switch&lt;/span&gt; (lambdaExpression.NodeType)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.Equal:&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;                    Expression right = (BinaryExpression)lambdaExpression;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                    filterList.Add((&lt;span class="kwrd"&gt;string&lt;/span&gt;)((ConstantExpression)right).Value);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;This function is to preserver the filter list and this list will be used we the code is to return the data source.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; IEnumerator&amp;lt;Student&amp;gt; GetEnumerator()
        {
            
            IEnumerator&amp;lt;Student&amp;gt; list = (IEnumerator&amp;lt;Student&amp;gt;)&lt;span class="kwrd"&gt;this&lt;/span&gt;;
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (functions == &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                &lt;span class="kwrd"&gt;return&lt;/span&gt; list;

            List&amp;lt;Student&amp;gt; result = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Student&amp;gt;();

            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (Student student &lt;span class="kwrd"&gt;in&lt;/span&gt; students)
            {
                &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt; filter &lt;span class="kwrd"&gt;in&lt;/span&gt; filterList)
                {
                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (student.FirstName.Equals(filter, StringComparison.OrdinalIgnoreCase))
                    {
                        result.Add(student);
                    }
                }
            }
            &lt;span class="kwrd"&gt;return&lt;/span&gt; result.GetEnumerator();
            
        }&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Now, we changed the behavior from the original&amp;#160; LINQ expression from the case sensitive to not-sensitive.&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;  var classmates = from classmate &lt;span class="kwrd"&gt;in&lt;/span&gt; GetClassRoom2()&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;                             &lt;span class="kwrd"&gt;where&lt;/span&gt; classmate.FirstName==&lt;span class="str"&gt;&amp;quot;tom&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;                             select classmate;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;And&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;  var classmates = from classmate &lt;span class="kwrd"&gt;in&lt;/span&gt; GetClassRoom2()&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;                             &lt;span class="kwrd"&gt;where&lt;/span&gt; classmate.FirstName==&lt;span class="str"&gt;&amp;quot;Tom&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;                             select classmate;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;will be the same result.&lt;/p&gt;

&lt;p&gt;From now, a simple version of the LINQ to &amp;quot;Anything&amp;quot; can be released, welcome to send me email or leave a comment about this topic. &lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6730015" width="1" height="1"&gt;</content><author><name>RobertNet</name><uri>http://weblogs.asp.net/members/RobertNet.aspx</uri></author><category term="LINQ" scheme="http://weblogs.asp.net/robertxue/archive/tags/LINQ/default.aspx" /><category term="C#" scheme="http://weblogs.asp.net/robertxue/archive/tags/C_2300_/default.aspx" /></entry><entry><title>LINQ Tips #6 Create a LINQ to Anything(2)</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/robertxue/archive/2008/11/10/linq-tips-6-create-a-linq-to-anything-2.aspx" /><id>http://weblogs.asp.net/robertxue/archive/2008/11/10/linq-tips-6-create-a-linq-to-anything-2.aspx</id><published>2008-11-11T03:35:30Z</published><updated>2008-11-11T03:35:30Z</updated><content type="html">&lt;p&gt;Yesterday, we sort of created a baby step of a &lt;a href="http://weblogs.asp.net/robertxue/archive/2008/11/10/linq-tips-5-creating-a-linq-to-anything.aspx" target="_blank"&gt;LINQ to anything implementation&lt;/a&gt;; &lt;/p&gt;  &lt;p&gt;We stopped at the place to implement the interface IQueryProvider, the most important method in this interface for us is IQueryable&amp;lt;TElement&amp;gt; CreateQuery&amp;lt;TElement&amp;gt;(System.Linq.Expressions.Expression expression).&lt;/p&gt;  &lt;p&gt;Our code will look like:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt; &lt;span class="preproc"&gt;#region&lt;/span&gt; IQueryProvider Members&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; IQueryable&amp;lt;TElement&amp;gt; CreateQuery&amp;lt;TElement&amp;gt;(System.Linq.Expressions.Expression expression)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;            IQueryable&amp;lt;TElement&amp;gt; element = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;            &lt;span class="kwrd"&gt;switch&lt;/span&gt; (expression.NodeType)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; System.Linq.Expressions.ExpressionType.Call:&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;                    MethodCallExpression callExpression = (MethodCallExpression)expression;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;switch&lt;/span&gt; (callExpression.Method.Name)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;                    {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Select&amp;quot;&lt;/span&gt;:&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;                            element = &lt;span class="kwrd"&gt;new&lt;/span&gt; StudentQueryObject&amp;lt;TElement&amp;gt;(callExpression);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;                            &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;default&lt;/span&gt;:&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;                            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException(&lt;span class="str"&gt;&amp;quot;This method is not supported&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;                    }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; element;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; IQueryable CreateQuery(System.Linq.Expressions.Expression expression)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; CreateQuery&amp;lt;Student&amp;gt;(expression);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; TResult Execute&amp;lt;TResult&amp;gt;(System.Linq.Expressions.Expression expression)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;            MethodCallExpression callExpression = (MethodCallExpression)expression;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException(&lt;span class="str"&gt;&amp;quot;No execution is defined&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; Execute(System.Linq.Expressions.Expression expression)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; Execute&amp;lt;Student&amp;gt;(expression);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;div class="csharpcode"&gt;&amp;#160;&lt;/div&gt;

&lt;div class="csharpcode"&gt;Maybe you already noticed that in the &amp;quot;Select&amp;quot; method , We created a new class called StudentQueryObject. Before we went into this class, we can say that all the implementation we have now are kind of generic implementation and can be used under almost all situation.&lt;/div&gt;

&lt;div class="csharpcode"&gt;&amp;#160;&lt;/div&gt;

&lt;div class="csharpcode"&gt;The implementation for the StudentQueryObject class is &lt;/div&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; StudentQueryObject&amp;lt;T&amp;gt; : IQueryable&amp;lt;T&amp;gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; Expression _expression;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; StudentQueryObject(Expression expression)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;            _expression = expression;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        &lt;span class="preproc"&gt;#region&lt;/span&gt; IEnumerable&amp;lt;T&amp;gt; Members&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; IEnumerator&amp;lt;T&amp;gt; GetEnumerator()&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            MethodCallExpression callExpression = (MethodCallExpression)_expression;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;            ClassRoom2 classroom = (ClassRoom2)(((ConstantExpression)callExpression.Arguments[0]).Value);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;            UnaryExpression quote = (UnaryExpression)callExpression.Arguments[1];&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;            Expression&amp;lt;Func&amp;lt;Student, T&amp;gt;&amp;gt; projector = (Expression&amp;lt;Func&amp;lt;Student, T&amp;gt;&amp;gt;)quote.Operand;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            Func&amp;lt;Student, T&amp;gt; func= projector.Compile();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;            List&amp;lt;T&amp;gt; list = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;T&amp;gt;();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;            &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (Student student &lt;span class="kwrd"&gt;in&lt;/span&gt; classroom)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;                list.Add(func(&lt;span class="kwrd"&gt;new&lt;/span&gt; Student { FirstName=student.FirstName +&lt;span class="str"&gt;&amp;quot;Linq&amp;quot;&lt;/span&gt;, LastName=student.LastName + &lt;span class="str"&gt;&amp;quot;Linq&amp;quot;&lt;/span&gt; }));&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; list.GetEnumerator();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;        &lt;span class="preproc"&gt;#region&lt;/span&gt; IEnumerable Members&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; GetEnumerator();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;        &lt;span class="preproc"&gt;#region&lt;/span&gt; IQueryable Members&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Type ElementType&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;            get { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(T); }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  47:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  48:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  49:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; System.Linq.Expressions.Expression Expression&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  50:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  51:  &lt;/span&gt;            get { &lt;span class="kwrd"&gt;return&lt;/span&gt; _expression; }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  52:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  53:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  54:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; IQueryProvider Provider&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  55:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  56:  &lt;/span&gt;            get { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  57:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  58:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  59:  &lt;/span&gt;        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  60:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre&gt;The method of the GetEnumerator can be the data provider for the LINQ query source. So basically , we &lt;/pre&gt;

  &lt;pre&gt;can put the data provider logic here .In this example, I just changed the original provided data.&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;All the data will be added a word &amp;quot;Linq&amp;quot; at the tail.&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;This is a fairly simple implementation, But this can be extended to very complex scenario.The &lt;a href="http://www.codeplex.com/NFlickr" target="_blank"&gt;NFlickr&lt;/a&gt;  will have &lt;/pre&gt;

  &lt;pre&gt;a full set of implementation and I will have a post after the first release of the NFlickr.&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6728991" width="1" height="1"&gt;</content><author><name>RobertNet</name><uri>http://weblogs.asp.net/members/RobertNet.aspx</uri></author><category term="LINQ" scheme="http://weblogs.asp.net/robertxue/archive/tags/LINQ/default.aspx" /><category term="C#" scheme="http://weblogs.asp.net/robertxue/archive/tags/C_2300_/default.aspx" /></entry><entry><title>Using the Pex to write Unit test automatically</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/robertxue/archive/2008/11/10/using-the-pex-to-write-unit-test-automatically.aspx" /><id>http://weblogs.asp.net/robertxue/archive/2008/11/10/using-the-pex-to-write-unit-test-automatically.aspx</id><published>2008-11-10T20:55:11Z</published><updated>2008-11-10T20:55:11Z</updated><content type="html">&lt;p&gt;I know this is against &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development" target="_blank"&gt;TDD&lt;/a&gt; and I am not going to discuss this :)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://research.microsoft.com/" target="_blank"&gt;MSR&lt;/a&gt; just released a new product call &lt;a href="http://research.microsoft.com/Pex/" target="_blank"&gt;Pex&lt;/a&gt;, you can also find a video on PDC at &lt;a href="http://channel9.msdn.com/pdc2008/TL51/"&gt;http://channel9.msdn.com/pdc2008/TL51/&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Today , I am going to use Pex to write unit tests for my two ugly code.&lt;/p&gt;  &lt;p&gt;First, My original code is like&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; RunDemo(&lt;span class="kwrd"&gt;string&lt;/span&gt; message, &lt;span class="kwrd"&gt;int&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;, DateTime actionTime)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;          &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;            &lt;span class="kwrd"&gt;int&lt;/span&gt; length = message.Length;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; &amp;gt; length)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                &lt;span class="kwrd"&gt;value&lt;/span&gt; = 50;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; &amp;lt; 100)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;                &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; &lt;span class="kwrd"&gt;value&lt;/span&gt;; i++)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;                {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (actionTime &amp;lt; DateTime.Now)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;                    {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;                        Console.Write(message);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;                        Console.WriteLine();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; &amp;gt; 100)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;                        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;                            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;To see what will happen&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;                        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;                    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;                }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;It's basically the ugliest code I had ever written. But how the unit test will go?&lt;/p&gt;

&lt;p&gt;The test result will be like &lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/robertxue/WindowsLiveWriter/UsingthePextowriteUnittestautomatically_3BE/PexUnitTest1.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="134" alt="PexUnitTest1" src="http://weblogs.asp.net/blogs/robertxue/WindowsLiveWriter/UsingthePextowriteUnittestautomatically_3BE/PexUnitTest1_thumb.jpg" width="450" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;After we take a deeper look, we will find out that the failed unit test case is &lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;[TestMethod]&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;[PexRaisedException(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(NullReferenceException))]&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;[PexGeneratedBy(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Class1Test))]&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; RunDemo03()&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="kwrd"&gt;bool&lt;/span&gt; b;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    Class1 class1 = &lt;span class="kwrd"&gt;new&lt;/span&gt; Class1();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    b = &lt;span class="kwrd"&gt;this&lt;/span&gt;.RunDemo(class1, (&lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;span class="kwrd"&gt;null&lt;/span&gt;, 2, &lt;span class="kwrd"&gt;default&lt;/span&gt;(DateTime));&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;So we know in out RunDemo code, we need to have a argument safety&amp;#160; check first., So I neet to write the code like&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;           &lt;span class="rem"&gt;// &amp;lt;pex&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(message))&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;            // &amp;lt;/pex&amp;gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;The second&amp;#160; example is we are trying to write a Fibonacci code like this&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Fibonacci(&lt;span class="kwrd"&gt;int&lt;/span&gt; n)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;             &lt;span class="kwrd"&gt;return&lt;/span&gt; Fibonacci(n - 1) + Fibonacci(n - 2);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;style type="text/css"&gt;



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;The logic is so simple and we think we are done, but Pex dose not think so.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/robertxue/WindowsLiveWriter/UsingthePextowriteUnittestautomatically_3BE/PexUnitTest2.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="112" alt="PexUnitTest2" src="http://weblogs.asp.net/blogs/robertxue/WindowsLiveWriter/UsingthePextowriteUnittestautomatically_3BE/PexUnitTest2_thumb.jpg" width="450" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;And we need to fix the code as &lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Fibonacci(&lt;span class="kwrd"&gt;int&lt;/span&gt; n)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (n==1 || n==0)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; n;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;             &lt;span class="kwrd"&gt;return&lt;/span&gt; Fibonacci(n - 1) + Fibonacci(n - 2);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;style type="text/css"&gt;



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;

&lt;p&gt;In this two stupid simple code, we will have a quick snapshot&amp;#160; for the Pex tools.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Also, the Pex has some limitation and we need to know that Pex is code, not a real developer. 
    &lt;br /&gt;Pex assumes that the analyzed program is &lt;a href="http://research.microsoft.com/pex/wiki/Nondeterminism.html"&gt;deterministic&lt;/a&gt;. If it is not, Pex will go in cycles until it hits &lt;a href="http://research.microsoft.com/pex/wiki/PexSettingsAttributeBase.html"&gt;exploration bounds&lt;/a&gt;. &lt;/li&gt;

  &lt;li&gt;Pex does not handle multithreaded programs. &lt;/li&gt;

  &lt;li&gt;Pex does not understand native code, e.g. x86 instructions called through P/Invoke, &lt;/li&gt;

  &lt;li&gt;At this time, we only support Pex on the X86, 32-bit .NET framework. &lt;/li&gt;

  &lt;li&gt;In principle, Pex can analyze arbitrary .NET programs, written in any .NET language. 
    &lt;br /&gt;However, the VS AddIn and the code generation are only fully implemented for C#. &lt;/li&gt;

  &lt;li&gt;Pex injects generic callbacks when rewriting the IL method bodies. This has a side effect that it cannot instrument v1.0 and v1.1 .net module because their metadata models do not support generics. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;strike&gt;&lt;em&gt;There is one thing I don't like for the Pex is that Pex code generation&amp;#160; will only generate the MsTest project, I hope it can generate a NUnit or MBUnite project in future. (Removed after I read the resource on htp://www.codeplex.com/Pex)&lt;/em&gt;&lt;/strike&gt;&lt;/p&gt;

&lt;p&gt;In the coming days, I will introduce the coverage test done by the Pex.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6728755" width="1" height="1"&gt;</content><author><name>RobertNet</name><uri>http://weblogs.asp.net/members/RobertNet.aspx</uri></author></entry><entry><title>LINQ Tips #5 Creating a LINQ To Anything</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/robertxue/archive/2008/11/10/linq-tips-5-creating-a-linq-to-anything.aspx" /><id>http://weblogs.asp.net/robertxue/archive/2008/11/10/linq-tips-5-creating-a-linq-to-anything.aspx</id><published>2008-11-10T20:55:00Z</published><updated>2008-11-10T20:55:00Z</updated><content type="html">&lt;p&gt;We knew there are at least 3 implementation in .Net 3.5, they are LINQ to Objects, LINQ to XML and LINQ to SQL. I don't believe Microsoft will create different pattern for those.&lt;/p&gt;  &lt;p&gt;In my current open source project &lt;a href="http://www.codeplex.com/NFlickr" mce_href="http://www.codeplex.com/NFlickr" target="_blank"&gt;NFlickr&lt;/a&gt;, because I have thousands of the fotos at flickr.com , so I don't want to get everything and then filter it using the LINQ to Objects. I want to filter it on the server side and still use the same syntax.&lt;/p&gt;  &lt;p&gt;It's not easy, so I figured out that we need to start from something simple.In the previous post &lt;a href="http://technetguy.com/blog/2008/10/linq-tips-3-why-you-can-not-use-linq/" mce_href="http://technetguy.com/blog/2008/10/linq-tips-3-why-you-can-not-use-linq/" target="_blank"&gt;LINQ Tips #3--Why you can not use LINQ?&lt;/a&gt; , I already had a Student class and a Classroom class.&lt;/p&gt;  &lt;p&gt;What I need to do is to change the class Classroom inherited from IQueryable&amp;lt;Student&amp;gt;, not IEnumerable&amp;lt;Student&amp;gt; (We could make it generic, but we will do it later), The new Classroom class will be :&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ClassRoom2 : IQueryable&amp;lt;Student&amp;gt;, IEnumerator&amp;lt;Student&amp;gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; List&amp;lt;Student&amp;gt; students = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Student&amp;gt;();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; _index = 0;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Add(Student student)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;            students.Add(student);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        &lt;span class="preproc"&gt;#region&lt;/span&gt; IEnumerable&amp;lt;Student&amp;gt; Members&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; IEnumerator&amp;lt;Student&amp;gt; GetEnumerator()&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; (IEnumerator&amp;lt;Student&amp;gt;)&lt;span class="kwrd"&gt;this&lt;/span&gt;; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        &lt;span class="preproc"&gt;#region&lt;/span&gt; IEnumerable Members&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        IEnumerator IEnumerable.GetEnumerator()&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; GetEnumerator();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        &lt;span class="preproc"&gt;#region&lt;/span&gt; IEnumerator&amp;lt;Student&amp;gt; Members&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Student Current&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;            get { &lt;span class="kwrd"&gt;return&lt;/span&gt; students.ElementAt(_index-1); }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;        &lt;span class="preproc"&gt;#region&lt;/span&gt; IDisposable Members&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Dispose()&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;            &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;        &lt;span class="preproc"&gt;#region&lt;/span&gt; IEnumerator Members&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;        &lt;span class="kwrd"&gt;object&lt;/span&gt; IEnumerator.Current&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;            get { &lt;span class="kwrd"&gt;return&lt;/span&gt; Current; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; MoveNext()&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;            _index++;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (_index &amp;gt; students.Count)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  47:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Reset()&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  48:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  49:  &lt;/span&gt;            _index = 0;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  50:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  51:  &lt;/span&gt;        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  52:  &lt;/span&gt;        &lt;span class="preproc"&gt;#region&lt;/span&gt; IQueryable Members&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  53:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Type ElementType&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  54:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  55:  &lt;/span&gt;            get { &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException(); }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  56:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  57:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; System.Linq.Expressions.Expression Expression&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  58:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  59:  &lt;/span&gt;            get {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  60:  &lt;/span&gt;                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  61:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  62:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  63:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; IQueryProvider Provider&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  64:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  65:  &lt;/span&gt;            get {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  66:  &lt;/span&gt;                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  67:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  68:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  69:  &lt;/span&gt;        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  70:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

  &lt;br&gt;We will notice that there are three new properties which are ElementType,Expression,Provider.What's those three property means, and how can we get the right implementation? The answer is that we need to have the Classroom inherited from another interface--IQueryProvider. 

  &lt;br&gt;And we will have the three property implementation as :&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ClassRoom2 : IQueryable&amp;lt;Student&amp;gt;, IEnumerator&amp;lt;Student&amp;gt;, IQueryProvider&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        &lt;span class="preproc"&gt;#region&lt;/span&gt; IQueryable Members&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Type ElementType&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;            get { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Student); }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; System.Linq.Expressions.Expression Expression&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;            get {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; System.Linq.Expressions.Expression.Constant(&lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; IQueryProvider Provider&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            get {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Then we need to implement the new four methods for the interface IQueryProvider:&lt;/p&gt;

&lt;p&gt;The key method for us is the Method IQueryable&amp;lt;TElement&amp;gt; CreateQuery&amp;lt;TElement&amp;gt;(System.Linq.Expressions.Expression expression).To understand&amp;nbsp; this method, I will suggest you to watch the video at &lt;a href="http://mschnlnine.vo.llnwd.net/d1/ch9/6/2/2/4/2/4/E2EMeijerDeBratLINQ_2MB_ch9.wmv" mce_href="http://mschnlnine.vo.llnwd.net/d1/ch9/6/2/2/4/2/4/E2EMeijerDeBratLINQ_2MB_ch9.wmv" target="_blank"&gt;Channel 9&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Tomorrow, I will continue on this topic and finish the full implementation and you will know how powerful the LINQ can be!&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6728756" width="1" height="1"&gt;</content><author><name>RobertNet</name><uri>http://weblogs.asp.net/members/RobertNet.aspx</uri></author><category term="LINQ" scheme="http://weblogs.asp.net/robertxue/archive/tags/LINQ/default.aspx" /><category term="C#" scheme="http://weblogs.asp.net/robertxue/archive/tags/C_2300_/default.aspx" /></entry><entry><title>Asp.Net Ajax #1 Show/Hide ModalPopup using Javscript</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/robertxue/archive/2008/11/10/asp-net-ajax-1-show-hide-modalpopup-using-javscript.aspx" /><id>http://weblogs.asp.net/robertxue/archive/2008/11/10/asp-net-ajax-1-show-hide-modalpopup-using-javscript.aspx</id><published>2008-11-10T20:54:33Z</published><updated>2008-11-10T20:54:33Z</updated><content type="html">&lt;p&gt;We I first started to use the &lt;a href="http://www.asp.net/ajax/ajaxcontroltoolkit/" target="_blank"&gt;Asp.Net Ajax toolkit&lt;/a&gt;, I found there is a very fundamental requirement&amp;#160; from a lot developers which we want to have some kinds of control on the client side, no need to trigger the service side event.&lt;/p&gt;  &lt;p&gt;After I did some investigation, I found a very easy built-in way to do it.&lt;/p&gt;  &lt;p&gt;The asp.net markup is like &lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Panel&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;pnlDemo&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;display:none&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;h1&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;This panel is a test demo&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;h1&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;       &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:Panel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;cc1:ModalPopupExtender&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ModalPopupExtender&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;  &lt;span class="attr"&gt;TargetControlID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;linkButton1&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;            &lt;span class="attr"&gt;PopupControlID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;pnlDemo&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;            &lt;span class="attr"&gt;BackgroundCssClass&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;modalBlockBackground&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;BehaviorID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ModalPopupExtender&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;            &lt;span class="attr"&gt;DynamicServicePath&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Enabled&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;True&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;cc1:ModalPopupExtender&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;If we want to use the javascript to control the popup, we can just simply to write the code like this:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt;(!show)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;  {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;     $find(&lt;span class="str"&gt;'ModalPopupExtender'&lt;/span&gt;).hide();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;  }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;  &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;  {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;      $find(&lt;span class="str"&gt;&amp;quot;ModalPopupExtender&amp;quot;&lt;/span&gt;).show(); &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;  }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;There is one thing need to be taken care which is the BehavirID, the code in the Javasctipt will look for the BehaviorID property for the ModalPopupExtender.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;I hope this can be helpful for you.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6728754" width="1" height="1"&gt;</content><author><name>RobertNet</name><uri>http://weblogs.asp.net/members/RobertNet.aspx</uri></author></entry><entry><title>Generic Event</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/robertxue/archive/2008/11/10/generic-event.aspx" /><id>http://weblogs.asp.net/robertxue/archive/2008/11/10/generic-event.aspx</id><published>2008-11-10T20:53:53Z</published><updated>2008-11-10T20:53:53Z</updated><content type="html">&lt;p&gt;In C#, when we need to have an event, we suppose to have a delegate first. Most of the delegate will be defined as the below one if it served for an event;&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;delegate&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SignatureRequiredEventHandler(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, SignatureRequiredEventArgs args);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;delegate&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SendRequestCompletedEventHandler(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, SendRequestCompletedEventArgs args);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;delegate&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; HttpRequestdEventHandler(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, HttpRequestEventArgs args);&lt;/pre&gt;
This code is copied from the the &lt;a href="http://www.codeplex.com/NFlickr" target="_blank"&gt;NFlickr&lt;/a&gt; opensource project.&lt;/div&gt;

&lt;div class="csharpcode"&gt;In my previous post, &lt;a href="http://technetguy.com/blog/2008/11/software-development-principle/" target="_blank"&gt;Software development principle&lt;/a&gt; , there is one principle called DRY(Don't Repeat Yourself), it's very obvious this kind of code is already not followed the good practice.&lt;/div&gt;

&lt;div class="csharpcode"&gt;&amp;#160;&lt;/div&gt;

&lt;div class="csharpcode"&gt;.Net now offer a generic event,you can find the MSDN document at &lt;a href="http://msdn.microsoft.com/en-us/library/db0etb8x.aspx" target="_blank"&gt;http://msdn.microsoft.com/en-us/library/db0etb8x.aspx&lt;/a&gt;&lt;/div&gt;

&lt;div class="csharpcode"&gt;&amp;#160;&lt;/div&gt;

&lt;div class="csharpcode"&gt;And we simply don't need the code we just presented.When we declare the event, we just need write the code like&lt;/div&gt;

&lt;div class="csharpcode"&gt;&amp;#160;&lt;/div&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; EventHandler&amp;lt;SendRequestCompletedEventArgs&amp;gt; Complete;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; EventHandler&amp;lt;HttpRequestCompletedEventArgs&amp;gt; RequestComplete;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; EventHandler&amp;lt;HttpRequestErrordEventArgs&amp;gt; RequestComplete;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; EventHandler&amp;lt;SignatureRequiredEventArgs&amp;gt; SignatureRequired;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;div class="csharpcode"&gt;&amp;#160;&lt;/div&gt;

&lt;div class="csharpcode"&gt;When we register the event, the code should be changed to &lt;/div&gt;

&lt;div class="csharpcode"&gt;&amp;#160;&lt;/div&gt;

&lt;pre class="csharpcode"&gt;channel.Complete +=&lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler&amp;lt;SendRequestCompletedEventArgs&amp;gt;(channel_Complete);&lt;/pre&gt;

&lt;p&gt;&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;font face="Consolas" color="#000000" size="2"&gt;There are some limitation here.&lt;/font&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;font face="Consolas" color="#000000" size="2"&gt;This generic even only can only replace the delegate which has two parameter , and the first parameter is object and second one is inherited from the EventArgs, basically the generic event only works well when we are going to use the standard event pattern.&lt;/font&gt; &lt;/li&gt;

  &lt;li&gt;&lt;font face="Consolas" color="#000000" size="2"&gt;This generic event can only replace the delegate which the return value is void.&lt;/font&gt;&amp;#160; &lt;/li&gt;
&lt;/ol&gt;

&lt;div class="csharpcode"&gt;&amp;#160;&lt;/div&gt;

&lt;div class="csharpcode"&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6728753" width="1" height="1"&gt;</content><author><name>RobertNet</name><uri>http://weblogs.asp.net/members/RobertNet.aspx</uri></author></entry></feed>