<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Daigo Hamura's Weblog : LINQ Project</title><link>http://blogs.msdn.com/daigoh/archive/tags/LINQ+Project/default.aspx</link><description>Tags: LINQ Project</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>DLINQ Is Magic</title><link>http://blogs.msdn.com/daigoh/archive/2006/04/17/577975.aspx</link><pubDate>Tue, 18 Apr 2006 06:42:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:577975</guid><dc:creator>daigoh</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/daigoh/comments/577975.aspx</comments><wfw:commentRss>http://blogs.msdn.com/daigoh/commentrss.aspx?PostID=577975</wfw:commentRss><description>&lt;P&gt;昨日と全く反対のタイトルですみません。　なぜか？　昨日書いた事は、今日の Check in で既に過去の物となってしまいました。 言語の視点から見た場合は、ほぼ同じなのですが、DLINQ　Engine の視点で見た場合 DLINQ は Magic になってしまいました。 この変更ももちろん LINQ Project Tech Preview を使っていただいている方々からの Feedback によるものですが、アーキテクチャの根幹に関わってくるデザインチェンジです。 次の Tech Preview が出るまでは、詳しく書く事はできませんが、Preview を RTW したあとに詳しく書いてみようと思います。&lt;/P&gt;
&lt;P&gt;DLINQ Magic を書く前に、明日から次の Tech Preview が出るまでの間、変更点または DLINQ そのものを理解するためのキーとなる Expression Tree について書いて見ようと思います。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=577975" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/daigoh/archive/tags/LINQ+Project/default.aspx">LINQ Project</category></item><item><title>DLINQ は Magic か？</title><link>http://blogs.msdn.com/daigoh/archive/2006/04/16/577320.aspx</link><pubDate>Mon, 17 Apr 2006 05:59:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:577320</guid><dc:creator>daigoh</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/daigoh/comments/577320.aspx</comments><wfw:commentRss>http://blogs.msdn.com/daigoh/commentrss.aspx?PostID=577320</wfw:commentRss><description>&lt;P&gt;LINQ Project では In-Memory Query と DLINQ Query に同じ Query Expression が使えます。 コンパイラは Query Expression が In-Memory に対してかそれとも Relational DB なのか分かるのか？と言う質問をよくされます。&amp;nbsp; コンパイラがすごい事をしていると誤解されているようですので、その説明をちょっとだけ。　&lt;/P&gt;
&lt;P&gt;特に Magic は無く、Trick としては C#&amp;nbsp;3.0 で新しく追加された&lt;BR&gt;&amp;nbsp;&amp;nbsp; 1. Query Operators はオーバーロード可能&lt;BR&gt;&amp;nbsp;&amp;nbsp; 2.&amp;nbsp; lambda 式は &lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 'MS Mincho'; mso-fareast-language: JA; mso-no-proof: yes; mso-ansi-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;SPAN style="COLOR: teal"&gt;Expression&lt;/SPAN&gt;&amp;lt;&lt;FONT color=teal&gt;&lt;SPAN style="COLOR: teal"&gt;Func&lt;/SPAN&gt;&lt;/FONT&gt;&amp;lt;...&amp;gt;&amp;gt; &lt;/SPAN&gt;にアサインされた場合 Expression Tree を IL の代わりに Emit する&lt;/P&gt;
&lt;P&gt;の二つだけです。例えば、LINQ In-Memory Query の場合&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-fareast-language: ZH-TW; mso-no-proof: yes"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;var&lt;/SPAN&gt;&lt;/FONT&gt; q = &lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;from&lt;/SPAN&gt;&lt;/FONT&gt; x &lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;in&lt;/SPAN&gt;&lt;/FONT&gt; &lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt;&lt;/FONT&gt; &lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt;&lt;/FONT&gt;[]{1,2,3,4}&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-fareast-language: ZH-TW; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 　&lt;/SPAN&gt;&lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;where&lt;/SPAN&gt;&lt;/FONT&gt; x &amp;gt; 2&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-fareast-language: ZH-TW; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 　&lt;/SPAN&gt;&lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;select&lt;/SPAN&gt;&lt;/FONT&gt; x;&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;は&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT face="Courier New" color=blue size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-fareast-language: ZH-TW; mso-no-proof: yes"&gt;int&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-fareast-language: ZH-TW; mso-no-proof: yes"&gt;[] q = (&lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt;&lt;/FONT&gt; &lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt;&lt;/FONT&gt;[]{1,2,3,4}).Where(x =&amp;gt; x &amp;gt; 2);&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;に、まず変換されます。ここで使われる Where Operator は&lt;BR&gt;&lt;FONT face="Courier New" color=teal size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-fareast-language: ZH-TW; mso-no-proof: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;IEnumerable&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-fareast-language: ZH-TW; mso-no-proof: yes"&gt;&amp;lt;T&amp;gt; Where&amp;lt;T&amp;gt;(&lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;&lt;/FONT&gt; &lt;FONT color=teal&gt;&lt;SPAN style="COLOR: teal"&gt;IEnumerable&lt;/SPAN&gt;&lt;/FONT&gt;&amp;lt;T&amp;gt; source, &lt;FONT color=teal&gt;&lt;SPAN style="COLOR: teal"&gt;Func&lt;/SPAN&gt;&lt;/FONT&gt;&amp;lt;T, &lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;bool&lt;/SPAN&gt;&lt;/FONT&gt;&amp;gt; predicate)&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;です。 理由は 普通に Overload&amp;nbsp; の解決で &lt;FONT face="Courier New" color=teal size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: PMingLiU; mso-fareast-language: JA; mso-no-proof: yes; mso-ansi-language: EN-US; mso-bidi-language: AR-SA"&gt;IEnumerable&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: PMingLiU; mso-fareast-language: JA; mso-no-proof: yes; mso-ansi-language: EN-US; mso-bidi-language: AR-SA"&gt;&amp;lt;T&amp;gt;&lt;/SPAN&gt;&lt;/FONT&gt; へ Implicitly Convertable な &lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: PMingLiU; mso-fareast-language: JA; mso-no-proof: yes; mso-ansi-language: EN-US; mso-bidi-language: AR-SA"&gt;new&lt;/SPAN&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: PMingLiU; mso-fareast-language: JA; mso-no-proof: yes; mso-ansi-language: EN-US; mso-bidi-language: AR-SA"&gt; &lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt;&lt;/FONT&gt;[] &lt;/SPAN&gt;&lt;/FONT&gt;が最初の Where Operator の引数だからからです。&lt;/P&gt;
&lt;P&gt;では、DLINQ Query の場合を見てみると、&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT face="Courier New" color=blue size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-fareast-language: ZH-TW; mso-no-proof: yes"&gt;var&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-fareast-language: ZH-TW; mso-no-proof: yes"&gt; q = &lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;from&lt;/SPAN&gt;&lt;/FONT&gt; x &lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;in&lt;/SPAN&gt;&lt;/FONT&gt; db.Customer&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-fareast-language: ZH-TW; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="MS Mincho" size=2&gt;&lt;SPAN lang=JA style="FONT-SIZE: 10pt; FONT-FAMILY: 'MS Mincho'; mso-bidi-font-family: 'Courier New'; mso-no-proof: yes"&gt;　&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=blue size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-fareast-language: ZH-TW; mso-no-proof: yes"&gt;where&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-fareast-language: ZH-TW; mso-no-proof: yes"&gt; x.ContactName == &lt;FONT color=maroon&gt;&lt;SPAN style="COLOR: maroon"&gt;"Hoge"&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-fareast-language: ZH-TW; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="MS Mincho" size=2&gt;&lt;SPAN lang=JA style="FONT-SIZE: 10pt; FONT-FAMILY: 'MS Mincho'; mso-bidi-font-family: 'Courier New'; mso-no-proof: yes"&gt;　&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=blue size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-fareast-language: ZH-TW; mso-no-proof: yes"&gt;select&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-fareast-language: ZH-TW; mso-no-proof: yes"&gt; x;&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;は&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-fareast-language: ZH-TW; mso-no-proof: yes"&gt;q = db.Customer.Where(x =&amp;gt; x.ContactName == &lt;FONT color=maroon&gt;&lt;SPAN style="COLOR: maroon"&gt;"Hoge"&lt;/SPAN&gt;&lt;/FONT&gt;);&lt;/SPAN&gt;&lt;/FONT&gt;&lt;BR&gt;にと書き換えられ、&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT face="Courier New" color=teal size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-fareast-language: ZH-TW; mso-no-proof: yes"&gt;Query&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-fareast-language: ZH-TW; mso-no-proof: yes"&gt;&amp;lt;T&amp;gt; Where&amp;lt;T&amp;gt;(&lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;&lt;/FONT&gt; &lt;FONT color=teal&gt;&lt;SPAN style="COLOR: teal"&gt;Query&lt;/SPAN&gt;&lt;/FONT&gt;&amp;lt;T&amp;gt; source, &lt;FONT color=teal&gt;&lt;SPAN style="COLOR: teal"&gt;Expression&lt;/SPAN&gt;&lt;/FONT&gt;&amp;lt;&lt;FONT color=teal&gt;&lt;SPAN style="COLOR: teal"&gt;Func&lt;/SPAN&gt;&lt;/FONT&gt;&amp;lt;T, &lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;bool&lt;/SPAN&gt;&lt;/FONT&gt;&amp;gt;&amp;gt; predicate)&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;の Where Operator が使われます。Trick 1で書いたQuery Operator は Overload 可能がキーポイントです。 最初の&lt;FONT face="Courier New" size=2&gt;db.Customer&lt;/FONT&gt;&amp;nbsp;プロパティ の戻り値の型は &lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008080&gt;Table&lt;/FONT&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: PMingLiU; mso-fareast-language: JA; mso-no-proof: yes; mso-ansi-language: EN-US; mso-bidi-language: AR-SA"&gt;&amp;lt;T&amp;gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;。 クラスの関係は&lt;BR&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: PMingLiU; mso-fareast-language: JA; mso-no-proof: yes; mso-ansi-language: EN-US; mso-bidi-language: AR-SA"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;IEnumerable&lt;/SPAN&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: PMingLiU; mso-fareast-language: JA; mso-no-proof: yes; mso-ansi-language: EN-US; mso-bidi-language: AR-SA"&gt;&amp;lt;T&amp;gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: PMingLiU; mso-fareast-language: JA; mso-no-proof: yes; mso-ansi-language: EN-US; mso-bidi-language: AR-SA"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Query&lt;/SPAN&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: PMingLiU; mso-fareast-language: JA; mso-no-proof: yes; mso-ansi-language: EN-US; mso-bidi-language: AR-SA"&gt;&amp;lt;T&amp;gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: PMingLiU; mso-fareast-language: JA; mso-no-proof: yes; mso-ansi-language: EN-US; mso-bidi-language: AR-SA"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Table&lt;/SPAN&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: PMingLiU; mso-fareast-language: JA; mso-no-proof: yes; mso-ansi-language: EN-US; mso-bidi-language: AR-SA"&gt;&amp;lt;T&amp;gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;よって、Overload の解決は &lt;SPAN style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: PMingLiU; mso-fareast-language: JA; mso-no-proof: yes; mso-ansi-language: EN-US; mso-bidi-language: AR-SA"&gt;Table&lt;/SPAN&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: PMingLiU; mso-fareast-language: JA; mso-no-proof: yes; mso-ansi-language: EN-US; mso-bidi-language: AR-SA"&gt;&amp;lt;T&amp;gt; &lt;/SPAN&gt;&lt;/FONT&gt;により近い &lt;SPAN style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: PMingLiU; mso-fareast-language: JA; mso-no-proof: yes; mso-ansi-language: EN-US; mso-bidi-language: AR-SA"&gt;Query&lt;/SPAN&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: PMingLiU; mso-fareast-language: JA; mso-no-proof: yes; mso-ansi-language: EN-US; mso-bidi-language: AR-SA"&gt;&amp;lt;T&amp;gt; &lt;FONT face="Times New Roman" size=3&gt;へと、つまり、&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: PMingLiU; mso-fareast-language: JA; mso-no-proof: yes; mso-ansi-language: EN-US; mso-bidi-language: AR-SA"&gt;Where&amp;lt;T&amp;gt;(&lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;&lt;/FONT&gt; &lt;FONT color=teal&gt;&lt;SPAN style="COLOR: teal"&gt;Query&lt;/SPAN&gt;&lt;/FONT&gt;&amp;lt;T&amp;gt;..) &lt;/SPAN&gt;の方が &lt;FONT face="Courier New" size=2&gt;Where&amp;lt;T&amp;gt;(&lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;&lt;/FONT&gt; &lt;FONT color=teal&gt;&lt;SPAN style="COLOR: teal"&gt;IEnumerable&lt;/SPAN&gt;&lt;/FONT&gt;&amp;lt;T&amp;gt; ...) &lt;/FONT&gt;よりも Better となる訳です。&amp;nbsp;ここで先ほどの Trick の２番目、lambda 式の &lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 'MS Mincho'; mso-fareast-language: JA; mso-no-proof: yes; mso-ansi-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;SPAN style="COLOR: teal"&gt;Expression&lt;/SPAN&gt;&amp;lt;&lt;FONT color=teal&gt;&lt;SPAN style="COLOR: teal"&gt;Func&lt;/SPAN&gt;&lt;/FONT&gt;&amp;lt;..&amp;gt;&amp;gt;&lt;/SPAN&gt;への変換が登場します。 Query Expression の中の&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;x =&amp;gt; x.ContactName == &lt;FONT color=maroon&gt;&lt;SPAN style="COLOR: maroon"&gt;"Hoge"&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;は&lt;BR&gt;&lt;FONT face="Courier New" color=teal size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-fareast-language: ZH-TW; mso-no-proof: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Query&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-fareast-language: ZH-TW; mso-no-proof: yes"&gt;&amp;lt;T&amp;gt; Where&amp;lt;T&amp;gt;(&lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;&lt;/FONT&gt; &lt;FONT color=teal&gt;&lt;SPAN style="COLOR: teal"&gt;Query&lt;/SPAN&gt;&lt;/FONT&gt;&amp;lt;T&amp;gt; source, &lt;FONT color=teal&gt;&lt;SPAN style="COLOR: teal"&gt;Expression&lt;/SPAN&gt;&lt;/FONT&gt;&amp;lt;&lt;FONT color=teal&gt;&lt;SPAN style="COLOR: teal"&gt;Func&lt;/SPAN&gt;&lt;/FONT&gt;&amp;lt;T, &lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;bool&lt;/SPAN&gt;&lt;/FONT&gt;&amp;gt;&amp;gt; predicate)&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;の Where Operator&amp;nbsp;が使われる事により、２番目の引数、&lt;SPAN style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: PMingLiU; mso-fareast-language: ZH-TW; mso-no-proof: yes; mso-ansi-language: EN-US; mso-bidi-language: AR-SA"&gt;Expression&lt;/SPAN&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: PMingLiU; mso-fareast-language: ZH-TW; mso-no-proof: yes; mso-ansi-language: EN-US; mso-bidi-language: AR-SA"&gt;&amp;lt;&lt;FONT color=teal&gt;&lt;SPAN style="COLOR: teal"&gt;Func&lt;/SPAN&gt;&lt;/FONT&gt;&amp;lt;T, &lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;bool&lt;/SPAN&gt;&lt;/FONT&gt;&amp;gt;&amp;gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/FONT&gt;へとアサインされます。　lambda 式は &lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;SPAN style="COLOR: teal"&gt;Expression&lt;/SPAN&gt;&amp;lt;&lt;FONT color=teal&gt;&lt;SPAN style="COLOR: teal"&gt;Func&amp;lt;...&amp;gt;&amp;gt; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;にアサインされた事により無事にExpression Tree に書き出される事になります。&lt;/P&gt;
&lt;P&gt;Dlinq Engine は Expression Tree を元に C# から SQL の変換を行い Database へ SQL Query をなげ、結果を得ます。&lt;/P&gt;
&lt;P&gt;このように、LINQ は既存の言語の仕様の上に成り立っていると言うのが分かっていただけたかと思います。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=577320" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/daigoh/archive/tags/LINQ+Project/default.aspx">LINQ Project</category></item></channel></rss>