<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>黒龍's Blog</title><link>http://blogs.wankuma.com/kokuryu/</link><description>明日から役立つ無駄知識をあなたに(仮)</description><managingEditor>黒龍</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>黒龍</dc:creator><title>新年のご挨拶</title><link>http://blogs.wankuma.com/kokuryu/archive/2013/01/02/310528.aspx</link><pubDate>Wed, 02 Jan 2013 00:24:00 GMT</pubDate><guid>http://blogs.wankuma.com/kokuryu/archive/2013/01/02/310528.aspx</guid><wfw:comment>http://blogs.wankuma.com/kokuryu/comments/310528.aspx</wfw:comment><comments>http://blogs.wankuma.com/kokuryu/archive/2013/01/02/310528.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kokuryu/comments/commentRss/310528.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kokuryu/services/trackbacks/310528.aspx</trackback:ping><description>新年あけましておめでとうございます。
昨年末はクリスマス前に風邪を引いて治りかけた頃にノロにかかるという残念な年末となりましたが年もあけて体調もすっかりよくなりました。
去年はWindows PhoneとC#の基礎をまたしっかりやろうと思っていたのですが気がつけばObjective-Cの仕事が主になるという変化がありました。今年もあまり気負わず流れるがまま過ごしていきたいと思います。
最後になりましたが本年もよろしくお願いします。
&lt;img src ="http://blogs.wankuma.com/kokuryu/aggbug/310528.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>黒龍</dc:creator><title>Linq for Objective-Cでお手軽シーケンス処理</title><link>http://blogs.wankuma.com/kokuryu/archive/2012/12/10/307001.aspx</link><pubDate>Mon, 10 Dec 2012 15:00:00 GMT</pubDate><guid>http://blogs.wankuma.com/kokuryu/archive/2012/12/10/307001.aspx</guid><wfw:comment>http://blogs.wankuma.com/kokuryu/comments/307001.aspx</wfw:comment><comments>http://blogs.wankuma.com/kokuryu/archive/2012/12/10/307001.aspx#Feedback</comments><slash:comments>16</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kokuryu/comments/commentRss/307001.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kokuryu/services/trackbacks/307001.aspx</trackback:ping><description>&lt;p&gt;Objective-C Advent Calendar 2012の12/11の記事です。 &lt;/p&gt; &lt;p&gt;最近どの言語でもシーケンスに対する処理ライブラリが充実しています。Objective-Cにも列挙や列挙を行うための仕組みも用意されているので.netと同じようなアプローチでLinq的なメソッドを実装してみました。 &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;span class="deco" style="font-size: x-large"&gt;Linqって？&lt;/span&gt; &lt;/p&gt; &lt;p&gt;.netが持っているコレクションに対する操作をSQLチックに書けるコンパイラサポートの事なんですがここではコレクションに対する一連の操作メソッドという広義のLinqの方を取り上げます。&lt;/p&gt; &lt;p&gt;で、何が出来るかというとシーケンスに対するフィルタや変換、処理適用なんかがループ的な構文を使用する事なく記述できます。&lt;/p&gt; &lt;p&gt;例としてあるNSArrayからNSStringのものだけをNSArrayにするケースを考えてみます。&lt;/p&gt; &lt;p&gt;まぁ普通に考えると列挙して新しい配列に足し込んでってのが思いつきます。こんな感じに &lt;/p&gt;&lt;pre class="brush: objc" ;&gt;    NSMutableArray *stringArray = [[NSMutableArray alloc]init];
    NSMutableArray *result = [[NSMutableArray alloc]init];
    for (id obj in [stringArray objectEnumerator]) {
        if ([obj isKindOfClass:[NSString class]]) {
            [result addObject:obj];
        }
    }
    return [NSArray arrayWithArray:result];
&lt;/pre&gt;
&lt;p&gt;特に難しい事もないと思います。で、これを&lt;a href="https://github.com/RyujiSamejima/Linq"&gt;ここ&lt;/a&gt;で公開しているLinq for Objective-C(以下Linq)で書くとこんな感じ &lt;/p&gt;&lt;pre class="brush: objc" ;&gt;     return [[[stringArray objectEnumerator]ofClass:[NSString class]]toArray];
&lt;/pre&gt;
&lt;p&gt;ずいぶんとすっきりしたと思います。&lt;/p&gt;
&lt;p&gt;他にもフィルタをかけるwhere、変換を行うselectなんかがあります。ありそうな例としてNSDictionaryとして受信したjsonがあったとします。それをフィルタをかけながら独自型に変換するようなイメージで書くと… &lt;/p&gt;&lt;pre class="brush: objc" ;&gt;   NSArray *shops = [json objectForKey:@"shops"];
    return [[[shops objectEnumerator]
             select:^id(id shop) {
                 NSDictionary *shopDic = shop;
                 ShopData *result = [[ShopData alloc]init];
                 result.id = [json objectForKey:@"id"];
                 result.name = [json objectForKey:@"name"];
                 result.genre = [json objectForKey:@"genre"];
                 result.coordinate = CLLocationCoordinate2DMake([[json objectForKey:@"latitude"] doubleValue], [[json objectForKey:@"longitude"] doubleValue]);
                 result.image_url = [json objectForKey:@"image_url"];
                 return result;
             }]where:^BOOL(id item) {
                 return [(ShopData *)shop.genre isEqual:@"イタリアン"];
             }]toArray];
&lt;/pre&gt;
&lt;p&gt;こんな感じになります。&lt;/p&gt;
&lt;p&gt;まぁほとんど変換の部分が冗長なのでinitWithJSON:(NSDictionary*)json見たいなメソッドを作ってやればすっきりすると思います。&lt;/p&gt;
&lt;p&gt;他にもいろいろなメソッドの組み合わせでフィルタをかける事が出来ますが冗長になってしまう場合や処理を自分で書きたい場合はCustomEnumeratorという列挙処理のヘルパがありますので処理をブロックで渡す事で独自の列挙処理を行う事が出来ます。&lt;/p&gt;
&lt;p&gt;改行コードで一行ずつ取り出す例。マルチパートヘッダなど一気にNSStringに出来ないようなケースもあると思います。その場合はNSDataを直で列挙するobjectEnumeratorもカテゴリで追加しているのでcharでの処理も可能です。 &lt;/p&gt;&lt;pre class="brush: objc" ;&gt;- (NSEnumerator *)headers:(NSEnumerator *)src {
    return [[CustomEnumerator alloc]initWithFunction:src nextObjectBlock:^id(NSEnumerator *_src) {
        NSData * headData = [[_src takeWhile:^BOOL(id charNum) {
            
            char charByte = [( NSNumber*)charNum charValue];
            return (charByte != '\r');
        }]
                             toData];
        //最後まで読んでいるかチェックする。
        if ([[_src take:1]singleOrNil] == nil){
            //改行なく最後まで読んでいる場合は今回の解析は見送る。
            //バッファに今のデータを追加する。
            bufferData = [[NSMutableData alloc]initWithData:headData];
            return nil;
        }
        return [[NSString alloc]initWithData:headData encoding:NSUTF8StringEncoding];
    }];   
}
&lt;/pre&gt;
&lt;p&gt;これらの処理メソッドですがもう一つの特徴として遅延処理があげられます。どういう事かというとフィルタや選択の各種メソッドは呼んだだけでは処理が登録されるのみで最終的にforinで列挙する際やtoXXXメソッドで変換する際に処理される事になります。&lt;/p&gt;
&lt;p&gt;(toArray、toMutableArray、toDictionary、toMutableDictionary、toData、toStringなどいろいろな処理があります)&lt;/p&gt;
&lt;p&gt;なので通常こういった処理を分割した際にありがちなバッファのコピーが余計に発生する事はないためメモリには優しい処理となる可能性もあります。 色々とメソッドがあってややこしいですがネットでもいろんな言語でシーケンス処理の例はありますのでそれらの処理をうまくObjective-Cに持って来れると思います。&lt;/p&gt;
&lt;p&gt;また、ちょっとしたループ処理でも書けばバグの可能性は出てくるのでやりたい処理に注力できるこういったシーケンス処理ライブラリをぜひ使ってみませんか？（と、宣伝で締めてみる）&lt;/p&gt;
&lt;p&gt;それでわ～ &lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kokuryu/aggbug/307001.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>黒龍</dc:creator><title>Linq for Objective-C</title><link>http://blogs.wankuma.com/kokuryu/archive/2012/11/18/301785.aspx</link><pubDate>Sun, 18 Nov 2012 02:01:00 GMT</pubDate><guid>http://blogs.wankuma.com/kokuryu/archive/2012/11/18/301785.aspx</guid><wfw:comment>http://blogs.wankuma.com/kokuryu/comments/301785.aspx</wfw:comment><comments>http://blogs.wankuma.com/kokuryu/archive/2012/11/18/301785.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kokuryu/comments/commentRss/301785.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kokuryu/services/trackbacks/301785.aspx</trackback:ping><description>&lt;p&gt;ここのところWindowsから離れてiPhoneアプリ開発をやってます。言語の違いも大きいのですがやっぱり慣れた構文で書きたいのでブロック構文のカテゴリとかもりもり作ってます。で、そんな過程でObjective-CにLinqがないのがどうにも我慢できなかったので作ってみました。&lt;/p&gt; &lt;p&gt;Windows phone archでちらっと話してみたら意外と食いつきがよかったので晒しておきます。&lt;/p&gt; &lt;p&gt;&lt;a href="https://github.com/RyujiSamejima/Linq"&gt;RyujiSamejima/Linq ・ GitHub&lt;/a&gt;&lt;/p&gt; &lt;p&gt;匿名型がないとかジェネリックがないとか型推論がないとかで構文的にはどうしても冗長になっちゃいますが同じノウハウが使えるのは割といい感じです。&lt;/p&gt; &lt;p&gt; &lt;div id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:5bd69bd7-33bc-403e-8c00-8710ce3cd892" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"&gt;&lt;pre class="brush: objc";&gt;
NSMutableArray *shops = [[completedOperation.responseJSON objectForKey:@"results"]objectForKey:@"shop"];
NSMutableArray *shopList = [[[shops objectEnumerator]
                                      select:^id(id shop)
                                      {
                                          NSDictionary * shopDic = shop;
                                          return [shopData shopInitWithJson:shopDic];
                                      }]
                                     toArray];
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Objective-Cを触らざるをえないLinq星人な人にはお勧めです。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kokuryu/aggbug/301785.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>黒龍</dc:creator><title>ReactiveOAuthでお手軽ツイッター連携アプリ</title><link>http://blogs.wankuma.com/kokuryu/archive/2012/04/07/265039.aspx</link><pubDate>Sat, 07 Apr 2012 18:43:00 GMT</pubDate><guid>http://blogs.wankuma.com/kokuryu/archive/2012/04/07/265039.aspx</guid><wfw:comment>http://blogs.wankuma.com/kokuryu/comments/265039.aspx</wfw:comment><comments>http://blogs.wankuma.com/kokuryu/archive/2012/04/07/265039.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kokuryu/comments/commentRss/265039.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kokuryu/services/trackbacks/265039.aspx</trackback:ping><description>&lt;p&gt;いまどきはHello WorldならぬツイッターのTL表示がサンプルとしてよく見かけるように思います。お勉強の題材でも色々触っててふと思ったのですがStreamingのある今って@に反応するようなBotがタイムラグなしに実現できるんじゃなかろうか？と。というわけでやってみました。&lt;/p&gt; &lt;p&gt;まずは認証のための登録を&lt;a href="http://twitter.com/apps"&gt;http://twitter.com/apps&lt;/a&gt;で済ませておきます。（作るアプリのタイプによっては不要です）&lt;/p&gt; &lt;p&gt;で認証部分ですが&lt;a href="http://reactiveoauth.codeplex.com/" target="_blank"&gt;ReactiveOAuth&lt;/a&gt;を使わせていただきました。（@neueさん感謝です）&lt;/p&gt; &lt;p&gt;まぁゴテゴテかいてもあれなのでソースをば&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;static void &lt;/span&gt;Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)
{
    &lt;span style="color: blue"&gt;var &lt;/span&gt;client = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;OAuthClient&lt;/span&gt;(consumerKey, consumerSecret, accessToken)
    {
        Url = &lt;span style="color: #a31515"&gt;"https://userstream.twitter.com/2/user.json"
    &lt;/span&gt;};
    &lt;span style="color: blue"&gt;var &lt;/span&gt;us = client.GetResponseLines()
        .Where(s =&amp;gt; !&lt;span style="color: blue"&gt;string&lt;/span&gt;.IsNullOrWhiteSpace(s)) &lt;span style="color: green"&gt;// filter invalid data
        &lt;/span&gt;.Select(s =&amp;gt; &lt;span style="color: green"&gt;// 文字列JSONからXElementへ変換
            &lt;/span&gt;{
                &lt;span style="color: blue"&gt;using &lt;/span&gt;(&lt;span style="color: blue"&gt;var &lt;/span&gt;jsonReader = &lt;span style="color: #2b91af"&gt;JsonReaderWriterFactory&lt;/span&gt;.CreateJsonReader(&lt;span style="color: #2b91af"&gt;Encoding&lt;/span&gt;.Default.GetBytes(s), &lt;span style="color: #2b91af"&gt;XmlDictionaryReaderQuotas&lt;/span&gt;.Max))
                    &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;.Load(jsonReader);
            })
        .Where(d =&amp;gt; d.Element(&lt;span style="color: #a31515"&gt;"entities"&lt;/span&gt;) != &lt;span style="color: blue"&gt;null 
            &lt;/span&gt;&amp;amp;&amp;amp; d.Element(&lt;span style="color: #a31515"&gt;"entities"&lt;/span&gt;).Elements(&lt;span style="color: #a31515"&gt;"user_mentions"&lt;/span&gt;).Count(_ =&amp;gt; _.Element(&lt;span style="color: #a31515"&gt;"item"&lt;/span&gt;) != &lt;span style="color: blue"&gt;null &lt;/span&gt;&amp;amp;&amp;amp; _.Element(&lt;span style="color: #a31515"&gt;"item"&lt;/span&gt;).Element(&lt;span style="color: #a31515"&gt;"screen_name"&lt;/span&gt;).Value == &lt;span style="color: #a31515"&gt;"LinqFe"&lt;/span&gt;) &amp;gt; 0)
        &lt;span style="color: green"&gt;//.ObserveOnDispatcher()
        &lt;/span&gt;.Subscribe(
            d =&amp;gt; ParseAndAction(d),
            ex =&amp;gt; &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.Error.WriteLine(ReadWebException(ex)));

    &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.ReadKey();
    us.Dispose();
}&lt;/pre&gt;
&lt;p&gt;使い方のサンプルそのままな感じですが一応開設するとLinqTojson（&lt;span style="color: #2b91af"&gt;JsonReaderWriterFactory&lt;/span&gt;経由によるLinqToXML）な感じで読み取ってWhereのところでLinqFe宛のツイートをフィルタリングして中身を処理するParseAndAction()にXMLを渡す。ただそれだけです。&lt;/p&gt;
&lt;p&gt;Whereの中身がうるさい感じですがこういったWebのものはデシリアライズしてクラスに起しちゃうよりXMLで文字列で読み取ってるのが正解。。とおもいます。無関係な定義の変更なんかに煩わされずに済むので。いるとこだけ定義したクラスへのデシリアライズでもいいんですがさっと思いついた機能をさっと足すぐらいのほうが楽でいいです。&lt;/p&gt;
&lt;p&gt;で、作ってみたのがこちら。おうむ返しのBotでもいいんですがこないだからいじってたHotPepperからの検索をしてくれるBotにしてみました。実行結果はこちらになります。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://f.hatena.ne.jp/ryuji_samejima/20120407184226"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="DosPrompt" src="http://cdn-ak.f.st-hatena.com/images/fotolife/r/ryuji_samejima/20120407/20120407184226.png?1333791753"&gt;&lt;/a&gt;&lt;a href="http://f.hatena.ne.jp/ryuji_samejima/20120407184250"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="Result" src="http://cdn-ak.f.st-hatena.com/images/fotolife/r/ryuji_samejima/20120407/20120407184250.png?1333791773"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ReactiveOAuth、Rxのお手軽さとStreaming APIの強力さがよくわかる題材でした。こういったエージェントっぽい反応をするBotは以前はラグがあっていまいちだったんですが今はStreamingでリアルタイムに反応できるので面白いと思います。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kokuryu/aggbug/265039.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>黒龍</dc:creator><title>RXでのキャンセル</title><link>http://blogs.wankuma.com/kokuryu/archive/2012/02/08/252552.aspx</link><pubDate>Wed, 08 Feb 2012 00:49:00 GMT</pubDate><guid>http://blogs.wankuma.com/kokuryu/archive/2012/02/08/252552.aspx</guid><wfw:comment>http://blogs.wankuma.com/kokuryu/comments/252552.aspx</wfw:comment><comments>http://blogs.wankuma.com/kokuryu/archive/2012/02/08/252552.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kokuryu/comments/commentRss/252552.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kokuryu/services/trackbacks/252552.aspx</trackback:ping><description>&lt;p&gt;大事なことなのに放置してたのでエントリ。Rxでのいいところの一つにDisposeでのキャンセルがあると思います。とはいえ私もあまり詳しくないのでメモ代わりですがRxなクエリの最終段階の購読登録であるSubscribeメソッドですが戻りがIDisposableになってます。で、こいつのDisposeを呼ぶことでイベントハンドラから外れて以後のイベントは飛んでこなくなります。だいたい非同期にしたいからRx使うんで遅い(or その他)理由でキャンセルしたいケースがかなりあるかと思います。そんな時にDisposeってことで以前のコードにつけてみました。&lt;/p&gt; &lt;p&gt;で試してみるとおぉ～止まる。また取得して～おぉ～止まる。でもってまた取得して～～～？ん？取得しない？？&lt;/p&gt; &lt;p&gt;なんか固まってるっぽい。てかこの挙動HTTPの通信上限っぽい動き^^;&lt;/p&gt; &lt;p&gt;イベントハンドラからは外れているもののそもそもの受信待ちの取得ができなくなってDisposeされてない感じに思えます。んむむ。。。どうやればいいのかさっぱりわからん。色々調べていくといろんなやり方がありそうだけどもneueさんところにあったWebRequestをAbortするパターンってのが良さげでした。ただソースが追いにくい。。。Rxの習熟度が低い私からみるとまるで魔法のようなコード。ちょっとしっかり覚えなきゃだなぁ。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kokuryu/aggbug/252552.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>黒龍</dc:creator><title>marshal_as&amp;lt;const char*&amp;gt;はThread.Current.Cultureの影響を受ける</title><link>http://blogs.wankuma.com/kokuryu/archive/2012/02/07/252544.aspx</link><pubDate>Tue, 07 Feb 2012 22:58:00 GMT</pubDate><guid>http://blogs.wankuma.com/kokuryu/archive/2012/02/07/252544.aspx</guid><wfw:comment>http://blogs.wankuma.com/kokuryu/comments/252544.aspx</wfw:comment><comments>http://blogs.wankuma.com/kokuryu/archive/2012/02/07/252544.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kokuryu/comments/commentRss/252544.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kokuryu/services/trackbacks/252544.aspx</trackback:ping><description>&lt;p&gt;知ってる人からしたら当たり前なのかもですが不思議に思ったのでメモ。&lt;/p&gt; &lt;p&gt;C++/CLIですがアンマネージとの変換はいろいろ手法があります。まぁ文字列型もいろいろあるのでその辺は仕方ないんですが割と低レベルというかCレベルのものと組み合わせる時はconst char*になると思います。で、このconst char*とのやり取りですが.net からであればIntPtr ptr = Marshal::StringToHGlobalAnsi(text); あたりがメジャーかと思います。Marshal::FreeHGlobal(ptr);さえ忘れなければよくあるAnsi（sjis）な文字列との変換はオッケー。&lt;/p&gt; &lt;p&gt;で、タイトルに書いたmarshal_as&amp;lt;&amp;gt;ですがこいつも2008から入ってきたのと他の変換と同じに書けるのもあってモリモリ使ってました。が、こいつですが内部でWideCharToMultiByteを使っていることもあって現在のThreadのコードページの影響をうけます。どういうことかというとSystem:String^な文字列をSJISにしたいなぁって時にふつうのアプリからなら問題ないです。が、ローカライズで英語リソース読むようにCultureを変更するような場合だとSJISじゃなくてコードページ1252みたいなことになっちゃいます。&lt;/p&gt; &lt;p&gt;確かにローカライズで扱う文字も変わるとはいえアプリの本質も通信する先もSJISなのは変わらないので余計なお世話かなぁと感じた次第です。なのでSJISな奴との通信がある場合の変換はmarshal_asじゃなくStringToHGlobalAnsiあたりを使っとくほうが間違いがないと思います。上記挙動って覚えてればいいですがすっかり忘れる気がするので。&lt;/p&gt; &lt;p&gt;以上。あまり役に立たないかもな情報でした。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kokuryu/aggbug/252544.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>黒龍</dc:creator><title>JSONに苦しむの巻</title><link>http://blogs.wankuma.com/kokuryu/archive/2012/01/30/251442.aspx</link><pubDate>Mon, 30 Jan 2012 23:13:00 GMT</pubDate><guid>http://blogs.wankuma.com/kokuryu/archive/2012/01/30/251442.aspx</guid><wfw:comment>http://blogs.wankuma.com/kokuryu/comments/251442.aspx</wfw:comment><comments>http://blogs.wankuma.com/kokuryu/archive/2012/01/30/251442.aspx#Feedback</comments><slash:comments>292</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kokuryu/comments/commentRss/251442.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kokuryu/services/trackbacks/251442.aspx</trackback:ping><description>&lt;p&gt;しつこくも続いてます。&lt;/p&gt; &lt;p&gt;やっぱりJOSNのほうがデータ小さいしJSON対応にすっかーと思ってJsonReaderWriterFactoryを挟んでみたらあっさりと成功。いわゆるLinq to JSONってやつですな。気をよくしてSLとWP7もやりますかね～って感じで書き換えていったまではいいのですが。。。&lt;/p&gt; &lt;p&gt;ない。。。&lt;/p&gt; &lt;p&gt;WP7にJsonReaderWriterFactoryがねェ！！まじかよ～と嘆きつつもないものは仕方ないのでDataContractJsonSerializerでシリアライズする方向に。JsonReaderWriterFactoryは幸せなんですがマルチな展開を考えるとDataContractJsonSerializer一択って感じですね。。。とはいえWeb相手だとガッツリ定義できないことも多いのでなかなか悩ましい。。。とはいえDataContractJsonSerializer自体はかなりいい感じです。さっくりとデシリアライズできたのでなにも困らなかったです。JsonReaderWriterFactoryを使ってのLinqToJSONはT4とかで生かすといい感じになるんじゃないでしょうか。&lt;/p&gt; &lt;p&gt;今回とくに書くネタもないんですが検索部分を若干修正しました。複数回指定できるようなパラメータがあるんですが今までパラメータをWhere句から拾ってDictionaryに突っ込んでたので同一のキーが定義できなかったのでList&amp;lt;KeyValuePair&amp;lt;string, string&amp;gt;&amp;gt;な感じに変えるとともにドメイン（定義域）を持ったやつをクラスにくくり出しました。まぁふつうはEnumにするところなんですが最終的な文字列への落とし込みとExpressionからの拾い上げがめんどいのでEnumじゃないです。どういうものかというと。。。&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;
/// &lt;/span&gt;&lt;span style="color: green"&gt;検索範囲
&lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;
&lt;/span&gt;&lt;span style="color: blue"&gt;public struct &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Range
&lt;/span&gt;{
    &lt;span style="color: blue"&gt;private string &lt;/span&gt;_value;
    &lt;span style="color: blue"&gt;internal string &lt;/span&gt;Value { &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;_value; } }
    &lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Range &lt;/span&gt;m300 { &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Range&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"1"&lt;/span&gt;); } }
    &lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Range &lt;/span&gt;m500 { &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Range&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"2"&lt;/span&gt;); } }
    &lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Range &lt;/span&gt;km1 { &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Range&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"3"&lt;/span&gt;); } }
    &lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Range &lt;/span&gt;km2 { &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Range&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"4"&lt;/span&gt;); } }
    &lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Range &lt;/span&gt;km3 { &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Range&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"5"&lt;/span&gt;); } }
    &lt;span style="color: blue"&gt;private &lt;/span&gt;Range(&lt;span style="color: blue"&gt;string &lt;/span&gt;value) 
    {
        &lt;span style="color: blue"&gt;this&lt;/span&gt;._value = value;
    }
    &lt;span style="color: blue"&gt;public override string &lt;/span&gt;ToString()
    {
        &lt;span style="color: blue"&gt;return &lt;/span&gt;_value;
    }
    &lt;span style="color: blue"&gt;public static bool operator &lt;/span&gt;==(&lt;span style="color: #2b91af"&gt;Range &lt;/span&gt;lhs, &lt;span style="color: #2b91af"&gt;Range &lt;/span&gt;rhs)
    {
        &lt;span style="color: blue"&gt;return &lt;/span&gt;lhs.Value == rhs.Value;
    }
    &lt;span style="color: blue"&gt;public static bool operator &lt;/span&gt;!=(&lt;span style="color: #2b91af"&gt;Range &lt;/span&gt;lhs, &lt;span style="color: #2b91af"&gt;Range &lt;/span&gt;rhs)
    {
        &lt;span style="color: blue"&gt;return &lt;/span&gt;!(lhs == rhs);
    }
}

&lt;/pre&gt;
&lt;p&gt;こんな感じで文字列Enumっぽいものとしてよく作られるんじゃないかなぁと想像。こうすると文字列だと間違うところが間違えないし比較対象も限定できるので。（EqualsとかGetHashはいらないので手抜き^^;）&lt;/p&gt;
&lt;p&gt;実際動かしてみるとRxのメリットはかなり大きいですね。何より止まらずにデータが振ってくるのはかなり素敵な感じです。&lt;/p&gt;
&lt;p&gt;&lt;iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; padding-right: 0px; padding-top: 0px" title="Preview" height="120" marginheight="0" src="https://skydrive.live.com/embed?cid=FB3A5BA8F459C9C9&amp;amp;resid=FB3A5BA8F459C9C9%21356&amp;amp;authkey=AG3d3Cg0wi6ZVUM" frameborder="0" width="98" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;さぁ。準備はできたのでSilverlightのお勉強ができるぞっと。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kokuryu/aggbug/251442.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>黒龍</dc:creator><title>LinqTo? そしてRXへ&amp;hellip;</title><link>http://blogs.wankuma.com/kokuryu/archive/2012/01/21/250239.aspx</link><pubDate>Sat, 21 Jan 2012 18:57:00 GMT</pubDate><guid>http://blogs.wankuma.com/kokuryu/archive/2012/01/21/250239.aspx</guid><wfw:comment>http://blogs.wankuma.com/kokuryu/comments/250239.aspx</wfw:comment><comments>http://blogs.wankuma.com/kokuryu/archive/2012/01/21/250239.aspx#Feedback</comments><slash:comments>365</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kokuryu/comments/commentRss/250239.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kokuryu/services/trackbacks/250239.aspx</trackback:ping><description>&lt;P&gt;前回まででおよその形は出来上がりました。まぁいまどきのアプリってSilverlightとかだわなぁってことでSL、WP7から使えるようにライブラリをこさえてみようと思ったんですがうまくいかない。&lt;/P&gt;
&lt;P&gt;WebClientで同期でとっちゃってるんでそりゃ駄目だわな。非同期に書き換えるとして。。。IEnumerableで返せん。。。Linq構文あきらめてただのWebClientの非同期サンプルにする？それは負けだろう。&lt;/P&gt;
&lt;P&gt;&amp;#8230;Rxだな。。。&lt;/P&gt;
&lt;P&gt;とはいえRXで非同期をなんてサンプルはどこにでもある話。やるなら噂で聞いたIQbservableかなぁと漠然と思いながらneueさんのRxのライブラリ紹介とかを見ながらお勉強。どうせなら同じソースで動かしたいよねぇってことでRxを落としてくる。が、ここで問題発生。どうもWP7にはIQbservableがなさそうな予感。。。色々悩んだ結果以前の部分でIEnumerable&lt;T&gt;を返してたのでTの部分を非同期リクエストの戻りであるIObservable&lt;T[]&gt;を内包した形で返すことに。合わせてResult周りの型を変更。GourmetResult : ResultBase&lt;IOBSERVABLE&lt;GOURMET[]&gt;&amp;gt;な感じに。&lt;/P&gt;
&lt;P&gt;ではプロジェクトのほうを整えることに。Coreに切りだしていた部分はそのまま使うのでリンクで追加。あ、そうそうWP7にはExpressionVisitorがないんですがMSDNのサイトにソースが全部あるので追加。プロバイダ周りは書き換えるのでコピーで追加しました。全体像してはこんな感じ。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://f.hatena.ne.jp/ryuji_samejima/20120121173859"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=ソリューションエクスプローラ src="http://cdn-ak.f.st-hatena.com/images/fotolife/r/ryuji_samejima/20120121/20120121173859.png?1327135141"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;PagingQueryProviderを書き換えていくことにします。肝としてはWebClientで動機リクエストしてたところをIObservable化するところってことですが@ITにずばりな感じの入門記事があったのでそれを参考に。&lt;/P&gt;
&lt;P&gt;&lt;B&gt;&lt;A href="http://www.atmarkit.co.jp/fdotnet/introrx/introrx_01/introrx_01_01.html" target=_blank&gt;第1回　Reactive Extensionsの概要と利用方法&lt;/A&gt;&lt;/B&gt; 
&lt;P&gt;WebClientにDownloadStringAsyncってのが追加されてIObservable&lt;STRING&gt;で返ってきますのでその後パースしてってところは前と同じ。&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;req = &lt;SPAN style="COLOR: #2b91af"&gt;WebRequest&lt;/SPAN&gt;.Create(executeUrl);

&lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;o = req.DownloadStringAsync().Select(_ =&amp;gt;
    {
        &lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;element = &lt;SPAN style="COLOR: #2b91af"&gt;XDocument&lt;/SPAN&gt;.Parse(_);
        &lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;ns = element.Root.GetDefaultNamespace();

        &lt;SPAN style="COLOR: green"&gt;//エラーチェック
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;error = element.Descendants(ns + &lt;SPAN style="COLOR: #a31515"&gt;"error"&lt;/SPAN&gt;).FirstOrDefault();
        &lt;SPAN style="COLOR: blue"&gt;if &lt;/SPAN&gt;(error != &lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;) &lt;SPAN style="COLOR: blue"&gt;throw new &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;InvalidQueryException&lt;/SPAN&gt;(&lt;SPAN style="COLOR: blue"&gt;new &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;Error&lt;/SPAN&gt;(ns, error).Message);

        &lt;SPAN style="COLOR: green"&gt;//クエリー条件にマッチする、検索結果の全件数
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;.limit = &lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt;.Parse(element.Descendants(ns + &lt;SPAN style="COLOR: #a31515"&gt;"results_available"&lt;/SPAN&gt;).FirstOrDefault().Value);
        &lt;SPAN style="COLOR: green"&gt;//このＸＭＬに含まれる検索結果の件数クエリー条件にマッチする、検索結果の全件数
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;.returnedCount = &lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt;.Parse(element.Descendants(ns + &lt;SPAN style="COLOR: #a31515"&gt;"results_returned"&lt;/SPAN&gt;).FirstOrDefault().Value);
        &lt;SPAN style="COLOR: green"&gt;//検索結果の開始位置
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;resultStart = &lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt;.Parse(element.Descendants(ns + &lt;SPAN style="COLOR: #a31515"&gt;"results_start"&lt;/SPAN&gt;).FirstOrDefault().Value);

        &lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;collection = element.Descendants(ns + name);

        &lt;SPAN style="COLOR: green"&gt;//取得件数が指定されているなら補正する
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;if &lt;/SPAN&gt;(takeCount.HasValue)
        {
            &lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;endLimit = takeCount.Value + start;
            &lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;.limit = &lt;SPAN style="COLOR: #2b91af"&gt;Math&lt;/SPAN&gt;.Min(endLimit, &lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;.limit);
        }
        &lt;SPAN style="COLOR: blue"&gt;return &lt;/SPAN&gt;collection.Select(x =&amp;gt; innerBuilder(x)).ToArray();
    });

&lt;/PRE&gt;
&lt;P&gt;こんな感じです。パース後にDescendantsするとXElement[]になるんですが途中部分でサクッと変換はやりにくいので要素一個のファクトリメソッドを受け取るようにしておきました。（Func&lt;XELEMENT, T&gt;なinnnerBuilderってやつです）これでIObservable&lt;T[]&gt;って形になるのでこれを前回の結果のIEnumerableを内包した結果で返します。&lt;/P&gt;
&lt;P&gt;継続部分をとる必要がありますが以前はIEnumerable&lt;T&gt;だったので普通にConcatでした。今回はIObservable&lt;T[]&gt;とIEnumerable&lt;IOBSERVABLE&lt;T[]&gt;&amp;gt;をつないで返すことに。これはEnumerable.Repeat(o, 1).Concat(GetResultCore(url))でおけ。&lt;/P&gt;
&lt;P&gt;でとりだしの部分ですがIObservableとIEnumerable、配列が混在なのでちょっとややこしいですが分けて考えれば大丈夫。&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;context = &lt;SPAN style="COLOR: blue"&gt;new &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;HotpepperContext&lt;/SPAN&gt;(&lt;FONT color=#a31515&gt;&lt;APIキー&gt;&lt;/FONT&gt;);
&lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;query = (
    &lt;SPAN style="COLOR: blue"&gt;from &lt;/SPAN&gt;result &lt;SPAN style="COLOR: blue"&gt;in &lt;/SPAN&gt;context.Gourmet
    &lt;SPAN style="COLOR: blue"&gt;where &lt;/SPAN&gt;result.keyword == &lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;.textBox1.Text
    &lt;SPAN style="COLOR: blue"&gt;select &lt;/SPAN&gt;result).Take(100).First().Results.Concat();

&lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;subscribe = (
    &lt;SPAN style="COLOR: blue"&gt;from &lt;/SPAN&gt;results &lt;SPAN style="COLOR: blue"&gt;in &lt;/SPAN&gt;query
    &lt;SPAN style="COLOR: blue"&gt;from &lt;/SPAN&gt;shop &lt;SPAN style="COLOR: blue"&gt;in &lt;/SPAN&gt;results
    &lt;SPAN style="COLOR: blue"&gt;select &lt;/SPAN&gt;shop)
    .ObserveOnDispatcher()
    .Subscribe(_ =&amp;gt;
        {
            count++;
            &lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;.textBlock1.Text = count.ToString();
            &lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;.listBox1.Items.Add(_);
        });&lt;/PRE&gt;
&lt;P&gt;こうなります。前半は以前と同様IQeryableを使ってるところ。IEnumerableを含んだ（Resultsがそれ）結果がひとつ返るのでFirstしてResultsをConcat。この操作でIEnumerable&lt;IOBSERVABLE&lt;T[]&gt;&amp;gt;がIObservable&lt;T[]&gt;に平滑化されます。このまま続けて書いてもいいのですがここまではIQueryable、これからはIObservableという違いとT[]で返るのでSelectManyがわかりやすいように分けてクエリ構文で記載してみました。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://f.hatena.ne.jp/ryuji_samejima/20120121185028"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" border=0 alt=WP7結果 src="http://cdn-ak.f.st-hatena.com/images/fotolife/r/ryuji_samejima/20120121/20120121185028.png?1327139430"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;感触ですがかなり簡単に取れるのでいい感じ。もろもろまとめて公開予定ですがひとまずPageQueryProviderのソースだけでも乗っけときますね。&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: blue"&gt;using &lt;/SPAN&gt;System;
&lt;SPAN style="COLOR: blue"&gt;using &lt;/SPAN&gt;System.Collections.Generic;
&lt;SPAN style="COLOR: blue"&gt;using &lt;/SPAN&gt;System.Linq;
&lt;SPAN style="COLOR: blue"&gt;using &lt;/SPAN&gt;System.Text;
&lt;SPAN style="COLOR: blue"&gt;using &lt;/SPAN&gt;System.Linq.Expressions;
&lt;SPAN style="COLOR: blue"&gt;using &lt;/SPAN&gt;System.Xml.Linq;
&lt;SPAN style="COLOR: blue"&gt;using &lt;/SPAN&gt;System.Xml;
&lt;SPAN style="COLOR: blue"&gt;using &lt;/SPAN&gt;System.Net;
&lt;SPAN style="COLOR: blue"&gt;using &lt;/SPAN&gt;System.Reactive.Linq;
&lt;SPAN style="COLOR: blue"&gt;using &lt;/SPAN&gt;System.IO;

&lt;SPAN style="COLOR: blue"&gt;namespace &lt;/SPAN&gt;LinqToHotpepper
{
    &lt;SPAN style="COLOR: gray"&gt;/// &lt;SUMMARY&gt;
    /// &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;ファクトリクラス
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;/// &lt;/SUMMARY&gt;
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public static class &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;PagingQueryProvider
    &lt;/SPAN&gt;{
        &lt;SPAN style="COLOR: gray"&gt;/// &lt;SUMMARY&gt;
        /// &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;ファクトリメソッド
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;/// &lt;/SUMMARY&gt;
        /// &lt;PARAM name="apiKey"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;発行されたAPIキー&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&lt;/PARAM&gt;
        /// &lt;PARAM name="baseUrl"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;リクエストURL&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&lt;/PARAM&gt;
        /// &lt;PARAM name="name"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;抽出対象のXML要素名&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&lt;/PARAM&gt;
        /// &lt;PARAM name="builder"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;結果セットのファクトリ&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&lt;/PARAM&gt;
        /// &lt;PARAM name="innerBuilder"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;結果のファクトリ&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&lt;/PARAM&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public static &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;PagingQueryProvider&lt;/SPAN&gt;&lt;T1, T2&gt; Create&lt;T1, T2&gt;(&lt;SPAN style="COLOR: blue"&gt;string &lt;/SPAN&gt;apiKey, &lt;SPAN style="COLOR: blue"&gt;string &lt;/SPAN&gt;baseUrl, &lt;SPAN style="COLOR: blue"&gt;string &lt;/SPAN&gt;name, &lt;SPAN style="COLOR: #2b91af"&gt;Func&lt;/SPAN&gt;&amp;lt;&lt;SPAN style="COLOR: #2b91af"&gt;IEnumerable&lt;/SPAN&gt;&amp;lt;&lt;SPAN style="COLOR: #2b91af"&gt;IObservable&lt;/SPAN&gt;&lt;T2[]&gt;&amp;gt;, T1&amp;gt; builder, &lt;SPAN style="COLOR: #2b91af"&gt;Func&lt;/SPAN&gt;&amp;lt;&lt;SPAN style="COLOR: #2b91af"&gt;XElement&lt;/SPAN&gt;, T2&amp;gt; innerBuilder)
        {
            &lt;SPAN style="COLOR: blue"&gt;return new &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;PagingQueryProvider&lt;/SPAN&gt;&lt;T1,T2&gt;(apiKey, baseUrl, name, builder, innerBuilder, &lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;);
        }
        &lt;SPAN style="COLOR: gray"&gt;/// &lt;SUMMARY&gt;
        /// &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;ファクトリメソッド
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;/// &lt;/SUMMARY&gt;
        /// &lt;PARAM name="apiKey"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;発行されたAPIキー&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&lt;/PARAM&gt;
        /// &lt;PARAM name="baseUrl"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;リクエストURL&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&lt;/PARAM&gt;
        /// &lt;PARAM name="name"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;抽出対象のXML要素名&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&lt;/PARAM&gt;
        /// &lt;PARAM name="builder"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;結果のファクトリ&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&lt;/PARAM&gt;
        /// &lt;PARAM name="innerBuilder"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;結果セットのファクトリ&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&lt;/PARAM&gt;
        /// &lt;PARAM name="finder"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;要素から抽出を行うFinder&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&lt;/PARAM&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public static &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;PagingQueryProvider&lt;/SPAN&gt;&lt;T1, T2&gt; Create&lt;T1, T2&gt;(&lt;SPAN style="COLOR: blue"&gt;string &lt;/SPAN&gt;apiKey, &lt;SPAN style="COLOR: blue"&gt;string &lt;/SPAN&gt;baseUrl, &lt;SPAN style="COLOR: blue"&gt;string &lt;/SPAN&gt;name, &lt;SPAN style="COLOR: #2b91af"&gt;Func&lt;/SPAN&gt;&amp;lt;&lt;SPAN style="COLOR: #2b91af"&gt;IEnumerable&lt;/SPAN&gt;&amp;lt;&lt;SPAN style="COLOR: #2b91af"&gt;IObservable&lt;/SPAN&gt;&lt;T2[]&gt;&amp;gt;, T1&amp;gt; builder, &lt;SPAN style="COLOR: #2b91af"&gt;Func&lt;/SPAN&gt;&amp;lt;&lt;SPAN style="COLOR: #2b91af"&gt;XElement&lt;/SPAN&gt;, T2&amp;gt; innerBuilder, &lt;SPAN style="COLOR: #2b91af"&gt;EqualsFinder&lt;/SPAN&gt;&lt;T1&gt; finder)
        {
            &lt;SPAN style="COLOR: blue"&gt;return new &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;PagingQueryProvider&lt;/SPAN&gt;&lt;T1, T2&gt;(apiKey, baseUrl, name, builder, innerBuilder, finder);
        }
    }
    &lt;SPAN style="COLOR: blue"&gt;public class &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;PagingQueryProvider&lt;/SPAN&gt;&lt;T1, T2&gt; : &lt;SPAN style="COLOR: #2b91af"&gt;QueryProviderBase&lt;/SPAN&gt;&lt;T1&gt;
    {
        &lt;SPAN style="COLOR: gray"&gt;/// &lt;SUMMARY&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;発行されたAPIキー&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&lt;/SUMMARY&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private string &lt;/SPAN&gt;key;
        &lt;SPAN style="COLOR: gray"&gt;/// &lt;SUMMARY&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;リクエストURL&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&lt;/SUMMARY&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private string &lt;/SPAN&gt;baseUrl;
        &lt;SPAN style="COLOR: gray"&gt;/// &lt;SUMMARY&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;要素から抽出を行うFinder&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&lt;/SUMMARY&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;EqualsFinder&lt;/SPAN&gt;&lt;T1&gt; finder;
        &lt;SPAN style="COLOR: gray"&gt;/// &lt;SUMMARY&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;抽出対象のXML要素名&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&lt;/SUMMARY&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private string &lt;/SPAN&gt;name;
        &lt;SPAN style="COLOR: gray"&gt;/// &lt;SUMMARY&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;結果セットのファクトリ&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&lt;/SUMMARY&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;Func&lt;/SPAN&gt;&amp;lt;&lt;SPAN style="COLOR: #2b91af"&gt;IEnumerable&lt;/SPAN&gt;&amp;lt;&lt;SPAN style="COLOR: #2b91af"&gt;IObservable&lt;/SPAN&gt;&lt;T2[]&gt;&amp;gt;, T1&amp;gt; resultBuilder;
        &lt;SPAN style="COLOR: gray"&gt;/// &lt;SUMMARY&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;結果セットのファクトリ&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&lt;/SUMMARY&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;Func&lt;/SPAN&gt;&amp;lt;&lt;SPAN style="COLOR: #2b91af"&gt;XElement&lt;/SPAN&gt;, T2&amp;gt; innerBuilder;
        &lt;SPAN style="COLOR: gray"&gt;/// &lt;SUMMARY&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;開始件数&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&lt;/SUMMARY&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private int &lt;/SPAN&gt;start;
        &lt;SPAN style="COLOR: gray"&gt;/// &lt;SUMMARY&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;取得中件数&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&lt;/SUMMARY&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private int &lt;/SPAN&gt;index;
        &lt;SPAN style="COLOR: gray"&gt;/// &lt;SUMMARY&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;取得終了件数&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&lt;/SUMMARY&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private int &lt;/SPAN&gt;limit;
        &lt;SPAN style="COLOR: gray"&gt;/// &lt;SUMMARY&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;取得時の戻り件数（初回リクエスト時の戻り件数）&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&lt;/SUMMARY&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private int &lt;/SPAN&gt;returnedCount;
        &lt;SPAN style="COLOR: gray"&gt;/// &lt;SUMMARY&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;パラメータで指定された取得件数&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&lt;/SUMMARY&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private int&lt;/SPAN&gt;? takeCount;
        &lt;SPAN style="COLOR: gray"&gt;/// &lt;SUMMARY&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;デフォルトの取得件数&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&lt;/SUMMARY&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private const int &lt;/SPAN&gt;DEFAULT_COUNT = 30;

        &lt;SPAN style="COLOR: gray"&gt;/// &lt;SUMMARY&gt;
        /// &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;コンストラクタ
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;/// &lt;/SUMMARY&gt;
        /// &lt;PARAM name="apiKey"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;発行されたAPIキー&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&lt;/PARAM&gt;
        /// &lt;PARAM name="baseUrl"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;リクエストURL&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&lt;/PARAM&gt;
        /// &lt;PARAM name="name"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;抽出対象のXML要素名&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&lt;/PARAM&gt;
        /// &lt;PARAM name="builder"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;結果のファクトリ&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&lt;/PARAM&gt;
        /// &lt;PARAM name="finder"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;要素から抽出を行うFinder&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;&lt;/PARAM&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public &lt;/SPAN&gt;PagingQueryProvider(&lt;SPAN style="COLOR: blue"&gt;string &lt;/SPAN&gt;apiKey, &lt;SPAN style="COLOR: blue"&gt;string &lt;/SPAN&gt;baseUrl, &lt;SPAN style="COLOR: blue"&gt;string &lt;/SPAN&gt;name, &lt;SPAN style="COLOR: #2b91af"&gt;Func&lt;/SPAN&gt;&amp;lt;&lt;SPAN style="COLOR: #2b91af"&gt;IEnumerable&lt;/SPAN&gt;&amp;lt;&lt;SPAN style="COLOR: #2b91af"&gt;IObservable&lt;/SPAN&gt;&lt;T2[]&gt;&amp;gt;, T1&amp;gt; builder, &lt;SPAN style="COLOR: #2b91af"&gt;Func&lt;/SPAN&gt;&amp;lt;&lt;SPAN style="COLOR: #2b91af"&gt;XElement&lt;/SPAN&gt;, T2&amp;gt; innerBuilder, &lt;SPAN style="COLOR: #2b91af"&gt;EqualsFinder&lt;/SPAN&gt;&lt;T1&gt; finder)
        {
            &lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;.start = 0;
            &lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;.key = apiKey;
            &lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;.baseUrl = baseUrl;
            &lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;.name = name;
            &lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;.resultBuilder = builder;
            &lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;.innerBuilder = innerBuilder;
            &lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;.finder = finder;
        }

        &lt;SPAN style="COLOR: blue"&gt;protected override &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;IEnumerable&lt;/SPAN&gt;&lt;T1&gt; GetResult(&lt;SPAN style="COLOR: #2b91af"&gt;Expression &lt;/SPAN&gt;expression)
        {
            &lt;SPAN style="COLOR: #2b91af"&gt;InnermostFinder &lt;/SPAN&gt;innerFinder = &lt;SPAN style="COLOR: blue"&gt;new &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;InnermostFinder&lt;/SPAN&gt;();
            &lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;sb = &lt;SPAN style="COLOR: blue"&gt;new &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;StringBuilder&lt;/SPAN&gt;(baseUrl);
            sb.AppendFormat(&lt;SPAN style="COLOR: #a31515"&gt;"?key={0}"&lt;/SPAN&gt;, key);
            &lt;SPAN style="COLOR: blue"&gt;if &lt;/SPAN&gt;(finder != &lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;)
            {
                &lt;SPAN style="COLOR: #2b91af"&gt;MethodCallExpression &lt;/SPAN&gt;whereExpression = innerFinder.GetInnermostWhere(expression);
                &lt;SPAN style="COLOR: blue"&gt;if &lt;/SPAN&gt;(whereExpression != &lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;)
                {
                    &lt;SPAN style="COLOR: #2b91af"&gt;LambdaExpression &lt;/SPAN&gt;lambdaExpression = (&lt;SPAN style="COLOR: #2b91af"&gt;LambdaExpression&lt;/SPAN&gt;)((&lt;SPAN style="COLOR: #2b91af"&gt;UnaryExpression&lt;/SPAN&gt;)(whereExpression.Arguments[1])).Operand;
                    &lt;SPAN style="COLOR: green"&gt;// Send the lambda expression through the partial evaluator.
                    &lt;/SPAN&gt;lambdaExpression = (&lt;SPAN style="COLOR: #2b91af"&gt;LambdaExpression&lt;/SPAN&gt;)&lt;SPAN style="COLOR: #2b91af"&gt;Evaluator&lt;/SPAN&gt;.PartialEval(lambdaExpression);
                    finder.Expression = lambdaExpression.Body;

                    &lt;SPAN style="COLOR: blue"&gt;foreach &lt;/SPAN&gt;(&lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;item &lt;SPAN style="COLOR: blue"&gt;in &lt;/SPAN&gt;finder.Results)
                    {
                        sb.AppendFormat(&lt;SPAN style="COLOR: #a31515"&gt;"&amp;amp;{0}={1}"&lt;/SPAN&gt;, item.Key, item.Value);
                    }
                }
            }

            &lt;SPAN style="COLOR: #2b91af"&gt;MethodCallExpression &lt;/SPAN&gt;skipExpression = innerFinder.GetInnermostSkip(expression);
            &lt;SPAN style="COLOR: blue"&gt;if &lt;/SPAN&gt;(skipExpression != &lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;)
            {
                &lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;.start = &lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt;.Parse(&lt;SPAN style="COLOR: #2b91af"&gt;ExpressionTreeHelpers&lt;/SPAN&gt;.GetValueFromExpression(skipExpression.Arguments[1]));
            }

            &lt;SPAN style="COLOR: #2b91af"&gt;MethodCallExpression &lt;/SPAN&gt;takeExpression = innerFinder.GetInnermostTake(expression);
            &lt;SPAN style="COLOR: blue"&gt;if &lt;/SPAN&gt;(takeExpression != &lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;)
            {
                &lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;.takeCount = &lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt;.Parse(&lt;SPAN style="COLOR: #2b91af"&gt;ExpressionTreeHelpers&lt;/SPAN&gt;.GetValueFromExpression(takeExpression.Arguments[1]));
            }

            &lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;url = sb.ToString();

            &lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;executeUrl =  &lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt;.Format(&lt;SPAN style="COLOR: #a31515"&gt;"{0}&amp;amp;start={1}"&lt;/SPAN&gt;,url, start + 1);

            &lt;SPAN style="COLOR: blue"&gt;if &lt;/SPAN&gt;(takeCount.HasValue) executeUrl = &lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt;.Format(&lt;SPAN style="COLOR: #a31515"&gt;"{0}&amp;amp;count={1}"&lt;/SPAN&gt;, executeUrl, takeCount.Value);

            &lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;req = &lt;SPAN style="COLOR: #2b91af"&gt;WebRequest&lt;/SPAN&gt;.Create(executeUrl);

            &lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;o = req.DownloadStringAsync().Select(_ =&amp;gt;
                {
                    &lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;element = &lt;SPAN style="COLOR: #2b91af"&gt;XDocument&lt;/SPAN&gt;.Parse(_);
                    &lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;ns = element.Root.GetDefaultNamespace();

                    &lt;SPAN style="COLOR: green"&gt;//エラーチェック
                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;error = element.Descendants(ns + &lt;SPAN style="COLOR: #a31515"&gt;"error"&lt;/SPAN&gt;).FirstOrDefault();
                    &lt;SPAN style="COLOR: blue"&gt;if &lt;/SPAN&gt;(error != &lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;) &lt;SPAN style="COLOR: blue"&gt;throw new &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;InvalidQueryException&lt;/SPAN&gt;(&lt;SPAN style="COLOR: blue"&gt;new &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;Error&lt;/SPAN&gt;(ns, error).Message);

                    &lt;SPAN style="COLOR: green"&gt;//クエリー条件にマッチする、検索結果の全件数
                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;.limit = &lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt;.Parse(element.Descendants(ns + &lt;SPAN style="COLOR: #a31515"&gt;"results_available"&lt;/SPAN&gt;).FirstOrDefault().Value);
                    &lt;SPAN style="COLOR: green"&gt;//このＸＭＬに含まれる検索結果の件数クエリー条件にマッチする、検索結果の全件数
                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;.returnedCount = &lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt;.Parse(element.Descendants(ns + &lt;SPAN style="COLOR: #a31515"&gt;"results_returned"&lt;/SPAN&gt;).FirstOrDefault().Value);
                    &lt;SPAN style="COLOR: green"&gt;//検索結果の開始位置
                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;resultStart = &lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt;.Parse(element.Descendants(ns + &lt;SPAN style="COLOR: #a31515"&gt;"results_start"&lt;/SPAN&gt;).FirstOrDefault().Value);

                    &lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;collection = element.Descendants(ns + name);

                    &lt;SPAN style="COLOR: green"&gt;//取得件数が指定されているなら補正する
                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;if &lt;/SPAN&gt;(takeCount.HasValue)
                    {
                        &lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;endLimit = takeCount.Value + start;
                        &lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;.limit = &lt;SPAN style="COLOR: #2b91af"&gt;Math&lt;/SPAN&gt;.Min(endLimit, &lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;.limit);
                    }
                    &lt;SPAN style="COLOR: blue"&gt;return &lt;/SPAN&gt;collection.Select(x =&amp;gt; innerBuilder(x)).ToArray();
                });
            &lt;SPAN style="COLOR: blue"&gt;yield return &lt;/SPAN&gt;resultBuilder(&lt;SPAN style="COLOR: #2b91af"&gt;Enumerable&lt;/SPAN&gt;.Repeat(o, 1).Concat(GetResultCore(url)));
        }
        &lt;SPAN style="COLOR: gray"&gt;/// &lt;SUMMARY&gt;
        /// &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;繰り返し部分の取得実体
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;/// &lt;/SUMMARY&gt;
        /// &lt;PARAM name="url"&gt;&lt;/PARAM&gt;
        /// &lt;RETURNS&gt;&lt;/RETURNS&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;IEnumerable&lt;/SPAN&gt;&amp;lt;&lt;SPAN style="COLOR: #2b91af"&gt;IObservable&lt;/SPAN&gt;&lt;T2[]&gt;&amp;gt; GetResultCore(&lt;SPAN style="COLOR: blue"&gt;string &lt;/SPAN&gt;url)
        {
            &lt;SPAN style="COLOR: green"&gt;//次回取得位置を初期化
            &lt;/SPAN&gt;index = start + returnedCount;
            &lt;SPAN style="COLOR: green"&gt;//取得ループ開始
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;while &lt;/SPAN&gt;(&lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;)
            {
                &lt;SPAN style="COLOR: green"&gt;//欲しい件数が取れているなら終了
                &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;if &lt;/SPAN&gt;(limit &amp;lt; index + 1) &lt;SPAN style="COLOR: blue"&gt;yield break&lt;/SPAN&gt;;
                &lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;executeUrl = &lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt;.Format(&lt;SPAN style="COLOR: #a31515"&gt;"{0}&amp;amp;start={1}"&lt;/SPAN&gt;, url, start + 1);

                &lt;SPAN style="COLOR: green"&gt;//残りカウントを取得
                &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;leftCount = limit - (index + returnedCount);
                &lt;SPAN style="COLOR: green"&gt;//取得件数より小さければ取得件数を減らす
                &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;if &lt;/SPAN&gt;(leftCount &amp;lt; returnedCount) executeUrl = &lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt;.Format(&lt;SPAN style="COLOR: #a31515"&gt;"{0}&amp;amp;count={1}"&lt;/SPAN&gt;, executeUrl, leftCount);

                &lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;req = &lt;SPAN style="COLOR: #2b91af"&gt;WebRequest&lt;/SPAN&gt;.Create(executeUrl);

                &lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;o = req.DownloadStringAsync().Select(_ =&amp;gt;
                    {
                        &lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;element = &lt;SPAN style="COLOR: #2b91af"&gt;XDocument&lt;/SPAN&gt;.Parse(_);
                        &lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;ns = element.Root.GetDefaultNamespace();

                        &lt;SPAN style="COLOR: green"&gt;//エラーチェック
                        &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;error = element.Descendants(ns + &lt;SPAN style="COLOR: #a31515"&gt;"error"&lt;/SPAN&gt;).FirstOrDefault();
                        &lt;SPAN style="COLOR: blue"&gt;if &lt;/SPAN&gt;(error != &lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;) &lt;SPAN style="COLOR: blue"&gt;throw new &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;InvalidQueryException&lt;/SPAN&gt;(&lt;SPAN style="COLOR: blue"&gt;new &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;Error&lt;/SPAN&gt;(ns, error).Message);

                        &lt;SPAN style="COLOR: green"&gt;//クエリー条件にマッチする、検索結果の全件数
                        &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;total = element.Descendants(ns + &lt;SPAN style="COLOR: #a31515"&gt;"results_available"&lt;/SPAN&gt;).FirstOrDefault();
                        &lt;SPAN style="COLOR: green"&gt;// このＸＭＬに含まれる検索結果の件数クエリー条件にマッチする、検索結果の全件数
                        &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;returned = element.Descendants(ns + &lt;SPAN style="COLOR: #a31515"&gt;"results_returned"&lt;/SPAN&gt;).FirstOrDefault();
                        &lt;SPAN style="COLOR: green"&gt;//結果がなければ終了
                        &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;if &lt;/SPAN&gt;(total == &lt;SPAN style="COLOR: blue"&gt;null &lt;/SPAN&gt;|| total.Value == &lt;SPAN style="COLOR: #a31515"&gt;"0" &lt;/SPAN&gt;|| returned == &lt;SPAN style="COLOR: blue"&gt;null &lt;/SPAN&gt;|| returned.Value == &lt;SPAN style="COLOR: #a31515"&gt;"0"&lt;/SPAN&gt;) &lt;SPAN style="COLOR: #2b91af"&gt;Observable&lt;/SPAN&gt;.Empty&amp;lt;&lt;SPAN style="COLOR: #2b91af"&gt;XElement&lt;/SPAN&gt;[]&amp;gt;();

                        &lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;collection = element.Descendants(ns + name);

                        index += &lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt;.Parse(returned.Value);

                        &lt;SPAN style="COLOR: blue"&gt;return &lt;/SPAN&gt;collection.Select(x =&amp;gt; innerBuilder(x)).ToArray();
                    });
                &lt;SPAN style="COLOR: blue"&gt;yield return &lt;/SPAN&gt;o;
            }
        }
    }
}

&lt;SPAN style="COLOR: blue"&gt;public static class &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;WebRequestExtensions
&lt;/SPAN&gt;{
    &lt;SPAN style="COLOR: blue"&gt;public static &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;IObservable&lt;/SPAN&gt;&amp;lt;&lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt;&amp;gt; DownloadStringAsync(&lt;SPAN style="COLOR: blue"&gt;this &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;WebRequest &lt;/SPAN&gt;request)
    {
        &lt;SPAN style="COLOR: blue"&gt;return &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;Observable&lt;/SPAN&gt;.Defer(() =&amp;gt; &lt;SPAN style="COLOR: #2b91af"&gt;Observable&lt;/SPAN&gt;.FromAsyncPattern&amp;lt;&lt;SPAN style="COLOR: #2b91af"&gt;WebResponse&lt;/SPAN&gt;&amp;gt;(
                request.BeginGetResponse, request.EndGetResponse)()
            .Select(res =&amp;gt;
            {
                &lt;SPAN style="COLOR: blue"&gt;using &lt;/SPAN&gt;(&lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;stream = res.GetResponseStream())
                &lt;SPAN style="COLOR: blue"&gt;using &lt;/SPAN&gt;(&lt;SPAN style="COLOR: blue"&gt;var &lt;/SPAN&gt;sr = &lt;SPAN style="COLOR: blue"&gt;new &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;StreamReader&lt;/SPAN&gt;(stream))
                {
                    &lt;SPAN style="COLOR: blue"&gt;return &lt;/SPAN&gt;sr.ReadToEnd();
                }
            }));
    }
}

&lt;/PRE&gt;
&lt;P&gt;コーディング量はそうないもののいい感じにWP7対応できました。 &lt;/P&gt;
&lt;P&gt;※ひとまず今までの一式。WP7位置情報とか簡単に取れて面白いかも。&lt;/P&gt;
&lt;P&gt;&lt;IFRAME style="PADDING-BOTTOM: 0px; BACKGROUND-COLOR: #fcfcfc; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px" title=Preview height=120 marginHeight=0 src="https://skydrive.live.com/embed?cid=FB3A5BA8F459C9C9&amp;amp;resid=FB3A5BA8F459C9C9%21355&amp;amp;authkey=AC-F54pPec2Qzf8" frameBorder=0 width=98 marginWidth=0 scrolling=no&gt;&lt;/IFRAME&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/kokuryu/aggbug/250239.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>黒龍</dc:creator><title>Linq to いろいろその４。ページング対応部分を整えてLinqToHotpepperを完成させる</title><link>http://blogs.wankuma.com/kokuryu/archive/2012/01/10/249830.aspx</link><pubDate>Tue, 10 Jan 2012 01:37:00 GMT</pubDate><guid>http://blogs.wankuma.com/kokuryu/archive/2012/01/10/249830.aspx</guid><wfw:comment>http://blogs.wankuma.com/kokuryu/comments/249830.aspx</wfw:comment><comments>http://blogs.wankuma.com/kokuryu/archive/2012/01/10/249830.aspx#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kokuryu/comments/commentRss/249830.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kokuryu/services/trackbacks/249830.aspx</trackback:ping><description>&lt;p&gt;前回（&lt;a href="http://blogs.wankuma.com/kokuryu/archive/2012/01/09/247619.aspx"&gt;Linq to 色々その３．汎用的な呼び出しのベースを作成する。&lt;/a&gt;）、ひとまずクエリを投げて取得する汎用的なものは作成できました。今回はページング対応のものを完成させることにします。ページングで汎用的なものを作ればグルメサーチも店名サーチも両方使えますね！&lt;/p&gt; &lt;p&gt;今回ページングするにあたってSkipとTakeは必要そうなのでInnermostWhereFinderをInnermostFinderとリネームして中身にSkip、Takeの取得を追加します。&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Collections.Generic;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Linq;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Text;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Linq.Expressions;

&lt;span style="color: blue"&gt;namespace &lt;/span&gt;LinqToHotpepper
{
    &lt;span style="color: blue"&gt;internal class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;InnermostFinder &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;ExpressionVisitor
    &lt;/span&gt;{
        &lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MethodCallExpression &lt;/span&gt;innermostWhereExpression;
        &lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MethodCallExpression &lt;/span&gt;innermostSkipExpression;
        &lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MethodCallExpression &lt;/span&gt;innermostTakeExpression;

        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MethodCallExpression &lt;/span&gt;GetInnermostWhere(&lt;span style="color: #2b91af"&gt;Expression &lt;/span&gt;expression)
        {
            Visit(expression);
            &lt;span style="color: blue"&gt;return &lt;/span&gt;innermostWhereExpression;
        }

        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MethodCallExpression &lt;/span&gt;GetInnermostSkip(&lt;span style="color: #2b91af"&gt;Expression &lt;/span&gt;expression)
        {
            Visit(expression);
            &lt;span style="color: blue"&gt;return &lt;/span&gt;innermostSkipExpression;
        }
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MethodCallExpression &lt;/span&gt;GetInnermostTake(&lt;span style="color: #2b91af"&gt;Expression &lt;/span&gt;expression)
        {
            Visit(expression);
            &lt;span style="color: blue"&gt;return &lt;/span&gt;innermostTakeExpression;
        }
        &lt;span style="color: blue"&gt;protected override &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Expression &lt;/span&gt;VisitMethodCall(&lt;span style="color: #2b91af"&gt;MethodCallExpression &lt;/span&gt;expression)
        {
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(expression.Method.Name == &lt;span style="color: #a31515"&gt;"Where"&lt;/span&gt;)
                innermostWhereExpression = expression;

            &lt;span style="color: blue"&gt;if &lt;/span&gt;(expression.Method.Name == &lt;span style="color: #a31515"&gt;"Skip"&lt;/span&gt;)
                innermostSkipExpression = expression;
            
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(expression.Method.Name == &lt;span style="color: #a31515"&gt;"Take"&lt;/span&gt;)
                innermostTakeExpression = expression;

            Visit(expression.Arguments[0]);
            &lt;span style="color: blue"&gt;return &lt;/span&gt;expression;
        }
    }
}&lt;/pre&gt;&lt;pre class="code"&gt;Modifierも併せて修正。&lt;/pre&gt;&lt;pre class="code"&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Collections.Generic;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Linq;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Text;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Linq.Expressions;

&lt;span style="color: blue"&gt;namespace &lt;/span&gt;LinqToHotpepper
{
    &lt;span style="color: blue"&gt;public static class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ExpressionTreeModifier
    &lt;/span&gt;{
        &lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ExpressionTreeModifier&lt;/span&gt;&amp;lt;T&amp;gt; Create&amp;lt;T&amp;gt;(&lt;span style="color: #2b91af"&gt;IQueryable&lt;/span&gt;&amp;lt;T&amp;gt; query)
        {
            &lt;span style="color: blue"&gt;return new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ExpressionTreeModifier&lt;/span&gt;&amp;lt;T&amp;gt;(query);
        }
    }
    &lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ExpressionTreeModifier&lt;/span&gt;&amp;lt;T&amp;gt; : &lt;span style="color: #2b91af"&gt;ExpressionVisitor
    &lt;/span&gt;{
        &lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IQueryable&lt;/span&gt;&amp;lt;T&amp;gt; queryable;

        &lt;span style="color: blue"&gt;internal &lt;/span&gt;ExpressionTreeModifier(&lt;span style="color: #2b91af"&gt;IQueryable&lt;/span&gt;&amp;lt;T&amp;gt; query)
        {
            &lt;span style="color: blue"&gt;this&lt;/span&gt;.queryable = query;
        }

        &lt;span style="color: blue"&gt;protected override &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Expression &lt;/span&gt;VisitMethodCall(&lt;span style="color: #2b91af"&gt;MethodCallExpression &lt;/span&gt;node)
        {
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(node.Method.Name == &lt;span style="color: #a31515"&gt;"Where"&lt;/span&gt;)
                &lt;span style="color: blue"&gt;return &lt;/span&gt;Visit(node.Arguments[0]);

            &lt;span style="color: blue"&gt;if &lt;/span&gt;(node.Method.Name == &lt;span style="color: #a31515"&gt;"Skip"&lt;/span&gt;)
                &lt;span style="color: blue"&gt;return &lt;/span&gt;Visit(node.Arguments[0]);
            
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(node.Method.Name == &lt;span style="color: #a31515"&gt;"Take"&lt;/span&gt;)
                &lt;span style="color: blue"&gt;return &lt;/span&gt;Visit(node.Arguments[0]);
            
            &lt;span style="color: blue"&gt;return base&lt;/span&gt;.VisitMethodCall(node);
        }

        &lt;span style="color: blue"&gt;protected override &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Expression &lt;/span&gt;VisitConstant(&lt;span style="color: #2b91af"&gt;ConstantExpression &lt;/span&gt;c)
        {
            &lt;span style="color: green"&gt;// Replace the constant Query&amp;lt;T&amp;gt; arg with the queryable Place collection.
            &lt;/span&gt;&lt;span style="color: blue"&gt;if &lt;/span&gt;(c.Type == &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Query&lt;/span&gt;&amp;lt;T&amp;gt;))
                &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Expression&lt;/span&gt;.Constant(&lt;span style="color: blue"&gt;this&lt;/span&gt;.queryable);
            &lt;span style="color: blue"&gt;else
                return &lt;/span&gt;c;
        }
    }
}

Whereとおんなじ感じで追加。で、Whereの抽出部分を以前はQueryProviderBase&amp;lt;T&amp;gt;の中でやってたんですがSkipはページングしない場合は必要ないのでWhereの解釈部分も派生クラス側でやるように修正。&lt;/pre&gt;&lt;/pre&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Collections.Generic;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Linq;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Text;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Linq.Expressions;

&lt;span style="color: blue"&gt;namespace &lt;/span&gt;LinqToHotpepper
{
    &lt;span style="color: blue"&gt;public abstract class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;QueryProviderBase&lt;/span&gt;&amp;lt;T&amp;gt; : &lt;span style="color: #2b91af"&gt;IQueryProvider
    &lt;/span&gt;{
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IQueryable &lt;/span&gt;CreateQuery(&lt;span style="color: #2b91af"&gt;Expression &lt;/span&gt;expression)
        {
            &lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;elementType = &lt;span style="color: #2b91af"&gt;TypeSystem&lt;/span&gt;.GetElementType(expression.Type);
            &lt;span style="color: blue"&gt;try
            &lt;/span&gt;{
                &lt;span style="color: blue"&gt;return &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;IQueryable&lt;/span&gt;)&lt;span style="color: #2b91af"&gt;Activator&lt;/span&gt;.CreateInstance(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Query&lt;/span&gt;&amp;lt;&amp;gt;).MakeGenericType(elementType), &lt;span style="color: blue"&gt;new object&lt;/span&gt;[] { &lt;span style="color: blue"&gt;this&lt;/span&gt;, expression });
            }
            &lt;span style="color: blue"&gt;catch &lt;/span&gt;(System.Reflection.&lt;span style="color: #2b91af"&gt;TargetInvocationException &lt;/span&gt;tie)
            {
                &lt;span style="color: blue"&gt;throw &lt;/span&gt;tie.InnerException;
            }
        }

        &lt;span style="color: green"&gt;// Queryable's collection-returning standard query operators call this method.
        &lt;/span&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IQueryable&lt;/span&gt;&amp;lt;TResult&amp;gt; CreateQuery&amp;lt;TResult&amp;gt;(&lt;span style="color: #2b91af"&gt;Expression &lt;/span&gt;expression)
        {
            &lt;span style="color: blue"&gt;return new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Query&lt;/span&gt;&amp;lt;TResult&amp;gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;, expression);
        }

        &lt;span style="color: blue"&gt;public object &lt;/span&gt;Execute(&lt;span style="color: #2b91af"&gt;Expression &lt;/span&gt;expression)
        {
            &lt;span style="color: blue"&gt;return this&lt;/span&gt;.Execute&amp;lt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&amp;gt;(expression, &lt;span style="color: blue"&gt;false&lt;/span&gt;);
        }

        &lt;span style="color: green"&gt;// Queryable's "single value" standard query operators call this method.
        // It is also called from QueryableGourmetData.GetEnumerator().
        &lt;/span&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;TResult Execute&amp;lt;TResult&amp;gt;(&lt;span style="color: #2b91af"&gt;Expression &lt;/span&gt;expression)
        {
            &lt;span style="color: blue"&gt;bool &lt;/span&gt;IsEnumerable = (&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(TResult).Name == &lt;span style="color: #a31515"&gt;"IEnumerable`1"&lt;/span&gt;);

            &lt;span style="color: blue"&gt;return this&lt;/span&gt;.Execute&amp;lt;TResult&amp;gt;(expression, IsEnumerable);
        }

        &lt;span style="color: blue"&gt;public &lt;/span&gt;TResult Execute&amp;lt;TResult&amp;gt;(&lt;span style="color: #2b91af"&gt;Expression &lt;/span&gt;expression, &lt;span style="color: blue"&gt;bool &lt;/span&gt;IsEnumerable)
        {
            &lt;span style="color: green"&gt;// The expression must represent a query over the data source.
            &lt;/span&gt;&lt;span style="color: blue"&gt;if &lt;/span&gt;(!IsQueryOverDataSource(expression))
                &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;InvalidProgramException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"No query over the data source was specified."&lt;/span&gt;);

            &lt;span style="color: #2b91af"&gt;IQueryable&lt;/span&gt;&amp;lt;T&amp;gt; result = GetResult(expression).AsQueryable&amp;lt;T&amp;gt;();

            &lt;span style="color: blue"&gt;var &lt;/span&gt;treeCopier = &lt;span style="color: #2b91af"&gt;ExpressionTreeModifier&lt;/span&gt;.Create(result);
            &lt;span style="color: #2b91af"&gt;Expression &lt;/span&gt;newExpressionTree = treeCopier.Visit(expression);

            &lt;span style="color: green"&gt;// This step creates an IQueryable that executes by replacing Queryable methods with Enumerable methods.
            &lt;/span&gt;&lt;span style="color: blue"&gt;if &lt;/span&gt;(IsEnumerable)
                &lt;span style="color: blue"&gt;return &lt;/span&gt;(TResult)result.Provider.CreateQuery(newExpressionTree);
            &lt;span style="color: blue"&gt;else
                return &lt;/span&gt;(TResult)result.Provider.Execute(newExpressionTree);
        }

        &lt;span style="color: blue"&gt;private bool &lt;/span&gt;IsQueryOverDataSource(&lt;span style="color: #2b91af"&gt;Expression &lt;/span&gt;expression)
        {
            &lt;span style="color: green"&gt;// If expression represents an unqueried IQueryable data source instance,
            // expression is of type ConstantExpression, not MethodCallExpression.
            &lt;/span&gt;&lt;span style="color: blue"&gt;return &lt;/span&gt;(expression &lt;span style="color: blue"&gt;is &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MethodCallExpression&lt;/span&gt;);
        }

        &lt;span style="color: blue"&gt;protected abstract &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; GetResult(&lt;span style="color: #2b91af"&gt;Expression &lt;/span&gt;expression);
    }
}

あとはページング対応のProviderを実装。&lt;/pre&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Collections.Generic;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Linq;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Text;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Linq.Expressions;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Xml.Linq;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Xml;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Net;

&lt;span style="color: blue"&gt;namespace &lt;/span&gt;LinqToHotpepper
{
    &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;
    /// &lt;/span&gt;&lt;span style="color: green"&gt;ファクトリクラス
    &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;
    &lt;/span&gt;&lt;span style="color: blue"&gt;public static class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PagingQueryProvider
    &lt;/span&gt;{
        &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;
        /// &lt;/span&gt;&lt;span style="color: green"&gt;ファクトリメソッド
        &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name="apiKey"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;発行されたAPIキー&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="baseUrl"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;リクエストURL&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="name"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;抽出対象のXML要素名&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="builder"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;結果のファクトリ&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        &lt;/span&gt;&lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PagingQueryProvider&lt;/span&gt;&amp;lt;T&amp;gt; Create&amp;lt;T&amp;gt;(&lt;span style="color: blue"&gt;string &lt;/span&gt;apiKey, &lt;span style="color: blue"&gt;string &lt;/span&gt;baseUrl, &lt;span style="color: blue"&gt;string &lt;/span&gt;name, &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;&amp;gt;, T&amp;gt; builder)
        {
            &lt;span style="color: blue"&gt;return new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PagingQueryProvider&lt;/span&gt;&amp;lt;T&amp;gt;(apiKey, baseUrl, name, builder, &lt;span style="color: blue"&gt;null&lt;/span&gt;);
        }
        &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;
        /// &lt;/span&gt;&lt;span style="color: green"&gt;ファクトリメソッド
        &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name="apiKey"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;発行されたAPIキー&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="baseUrl"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;リクエストURL&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="name"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;抽出対象のXML要素名&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="builder"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;結果のファクトリ&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="finder"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;要素から抽出を行うFinder&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        &lt;/span&gt;&lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PagingQueryProvider&lt;/span&gt;&amp;lt;T&amp;gt; Create&amp;lt;T&amp;gt;(&lt;span style="color: blue"&gt;string &lt;/span&gt;apiKey, &lt;span style="color: blue"&gt;string &lt;/span&gt;baseUrl, &lt;span style="color: blue"&gt;string &lt;/span&gt;name, &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;&amp;gt;, T&amp;gt; builder, &lt;span style="color: #2b91af"&gt;EqualsFinder&lt;/span&gt;&amp;lt;T&amp;gt; finder)
        {
            &lt;span style="color: blue"&gt;return new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PagingQueryProvider&lt;/span&gt;&amp;lt;T&amp;gt;(apiKey, baseUrl, name, builder, finder);
        }
    }
    &lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PagingQueryProvider&lt;/span&gt;&amp;lt;T&amp;gt; : &lt;span style="color: #2b91af"&gt;QueryProviderBase&lt;/span&gt;&amp;lt;T&amp;gt;
    {
        &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;発行されたAPIキー&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;
        &lt;/span&gt;&lt;span style="color: blue"&gt;private string &lt;/span&gt;key;
        &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;リクエストURL&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;
        &lt;/span&gt;&lt;span style="color: blue"&gt;private string &lt;/span&gt;baseUrl;
        &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;要素から抽出を行うFinder&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;
        &lt;/span&gt;&lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EqualsFinder&lt;/span&gt;&amp;lt;T&amp;gt; finder;
        &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;抽出対象のXML要素名&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;
        &lt;/span&gt;&lt;span style="color: blue"&gt;private string &lt;/span&gt;name;
        &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;結果セットのファクトリ&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;
        &lt;/span&gt;&lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;&amp;gt;, T&amp;gt; resultBuilder;
        &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;開始件数&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;
        &lt;/span&gt;&lt;span style="color: blue"&gt;private int &lt;/span&gt;start;
        &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;取得中件数&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;
        &lt;/span&gt;&lt;span style="color: blue"&gt;private int &lt;/span&gt;index;
        &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;パラメータで指定された取得件数&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;
        &lt;/span&gt;&lt;span style="color: blue"&gt;private int&lt;/span&gt;? takeCount;

        &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;
        /// &lt;/span&gt;&lt;span style="color: green"&gt;コンストラクタ
        &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name="apiKey"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;発行されたAPIキー&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="baseUrl"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;リクエストURL&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="name"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;抽出対象のXML要素名&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="builder"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;結果のファクトリ&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="finder"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;要素から抽出を行うFinder&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        &lt;/span&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;PagingQueryProvider(&lt;span style="color: blue"&gt;string &lt;/span&gt;apiKey, &lt;span style="color: blue"&gt;string &lt;/span&gt;baseUrl, &lt;span style="color: blue"&gt;string &lt;/span&gt;name, &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;&amp;gt;, T&amp;gt; builder, &lt;span style="color: #2b91af"&gt;EqualsFinder&lt;/span&gt;&amp;lt;T&amp;gt; finder)
        {
            &lt;span style="color: blue"&gt;this&lt;/span&gt;.start = 0;
            &lt;span style="color: blue"&gt;this&lt;/span&gt;.key = apiKey;
            &lt;span style="color: blue"&gt;this&lt;/span&gt;.baseUrl = baseUrl;
            &lt;span style="color: blue"&gt;this&lt;/span&gt;.name = name;
            &lt;span style="color: blue"&gt;this&lt;/span&gt;.resultBuilder = builder;
            &lt;span style="color: blue"&gt;this&lt;/span&gt;.finder = finder;
        }

        &lt;span style="color: blue"&gt;protected override &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; GetResult(&lt;span style="color: #2b91af"&gt;Expression &lt;/span&gt;expression)
        {
            &lt;span style="color: #2b91af"&gt;InnermostFinder &lt;/span&gt;innerFinder = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;InnermostFinder&lt;/span&gt;();
            &lt;span style="color: blue"&gt;var &lt;/span&gt;sb = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;StringBuilder&lt;/span&gt;(baseUrl);
            sb.AppendFormat(&lt;span style="color: #a31515"&gt;"?key={0}"&lt;/span&gt;, key);
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(finder != &lt;span style="color: blue"&gt;null&lt;/span&gt;)
            {
                &lt;span style="color: #2b91af"&gt;MethodCallExpression &lt;/span&gt;whereExpression = innerFinder.GetInnermostWhere(expression);
                &lt;span style="color: blue"&gt;if &lt;/span&gt;(whereExpression != &lt;span style="color: blue"&gt;null&lt;/span&gt;)
                {
                    &lt;span style="color: #2b91af"&gt;LambdaExpression &lt;/span&gt;lambdaExpression = (&lt;span style="color: #2b91af"&gt;LambdaExpression&lt;/span&gt;)((&lt;span style="color: #2b91af"&gt;UnaryExpression&lt;/span&gt;)(whereExpression.Arguments[1])).Operand;
                    &lt;span style="color: green"&gt;// Send the lambda expression through the partial evaluator.
                    &lt;/span&gt;lambdaExpression = (&lt;span style="color: #2b91af"&gt;LambdaExpression&lt;/span&gt;)&lt;span style="color: #2b91af"&gt;Evaluator&lt;/span&gt;.PartialEval(lambdaExpression);
                    finder.Expression = lambdaExpression.Body;

                    &lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: blue"&gt;var &lt;/span&gt;item &lt;span style="color: blue"&gt;in &lt;/span&gt;finder.Results)
                    {
                        sb.AppendFormat(&lt;span style="color: #a31515"&gt;"&amp;amp;{0}={1}"&lt;/span&gt;, item.Key, item.Value);
                    }
                }
            }

            &lt;span style="color: #2b91af"&gt;MethodCallExpression &lt;/span&gt;skipExpression = innerFinder.GetInnermostSkip(expression);
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(skipExpression != &lt;span style="color: blue"&gt;null&lt;/span&gt;)
            {
                &lt;span style="color: blue"&gt;this&lt;/span&gt;.start = &lt;span style="color: blue"&gt;int&lt;/span&gt;.Parse(&lt;span style="color: #2b91af"&gt;ExpressionTreeHelpers&lt;/span&gt;.GetValueFromExpression(skipExpression.Arguments[1]));
            }

            &lt;span style="color: #2b91af"&gt;MethodCallExpression &lt;/span&gt;takeExpression = innerFinder.GetInnermostTake(expression);
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(takeExpression != &lt;span style="color: blue"&gt;null&lt;/span&gt;)
            {
                &lt;span style="color: blue"&gt;this&lt;/span&gt;.takeCount = &lt;span style="color: blue"&gt;int&lt;/span&gt;.Parse(&lt;span style="color: #2b91af"&gt;ExpressionTreeHelpers&lt;/span&gt;.GetValueFromExpression(takeExpression.Arguments[1]));
            }

            &lt;span style="color: blue"&gt;var &lt;/span&gt;url = sb.ToString();

            &lt;span style="color: blue"&gt;var &lt;/span&gt;executeUrl = url + &lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;"&amp;amp;start={0}&amp;amp;count=30"&lt;/span&gt;, start + 1);
            &lt;span style="color: blue"&gt;var &lt;/span&gt;element = &lt;span style="color: #2b91af"&gt;XDocument&lt;/span&gt;.Load(executeUrl);

            &lt;span style="color: green"&gt;//エラーチェック
            &lt;/span&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;error = element.Descendants(&lt;span style="color: #a31515"&gt;"{http://webservice.recruit.co.jp/HotPepper/}error"&lt;/span&gt;).FirstOrDefault();
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(error != &lt;span style="color: blue"&gt;null&lt;/span&gt;) &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;InvalidQueryException&lt;/span&gt;(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Error&lt;/span&gt;(error).Message);

            &lt;span style="color: green"&gt;//クエリー条件にマッチする、検索結果の全件数
            &lt;/span&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;total = &lt;span style="color: blue"&gt;int&lt;/span&gt;.Parse(element.Descendants(&lt;span style="color: #a31515"&gt;"{http://webservice.recruit.co.jp/HotPepper/}results_available"&lt;/span&gt;).FirstOrDefault().Value);
            &lt;span style="color: green"&gt;//このＸＭＬに含まれる検索結果の件数クエリー条件にマッチする、検索結果の全件数
            &lt;/span&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;returned = &lt;span style="color: blue"&gt;int&lt;/span&gt;.Parse(element.Descendants(&lt;span style="color: #a31515"&gt;"{http://webservice.recruit.co.jp/HotPepper/}results_returned"&lt;/span&gt;).FirstOrDefault().Value);
            &lt;span style="color: green"&gt;//検索結果の開始位置
            &lt;/span&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;resultStart = &lt;span style="color: blue"&gt;int&lt;/span&gt;.Parse(element.Descendants(&lt;span style="color: #a31515"&gt;"{http://webservice.recruit.co.jp/HotPepper/}results_start"&lt;/span&gt;).FirstOrDefault().Value);

            &lt;span style="color: blue"&gt;var &lt;/span&gt;collection = element.Descendants(&lt;span style="color: #a31515"&gt;"{http://webservice.recruit.co.jp/HotPepper/}" &lt;/span&gt;+ name);

            &lt;span style="color: blue"&gt;var &lt;/span&gt;limit =total;

            &lt;span style="color: blue"&gt;if &lt;/span&gt;(takeCount.HasValue) limit = takeCount.Value + start;

            &lt;span style="color: green"&gt;//残りがあるなら残りのリクエストをシーケンスにくっつけておく
            &lt;/span&gt;&lt;span style="color: blue"&gt;if &lt;/span&gt;(resultStart + returned &amp;lt; limit)
            {
                &lt;span style="color: green"&gt;//次の呼び出しのためにカウンタを進めておく
                &lt;/span&gt;index = start + returned;
                collection = collection.Concat(&lt;span style="color: blue"&gt;this&lt;/span&gt;.GetResultCore(url));
            }
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(takeCount.HasValue)
            {
                collection.Take(takeCount.Value);
            }
            &lt;span style="color: blue"&gt;yield return &lt;/span&gt;resultBuilder(collection);
        }
        &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;
        /// &lt;/span&gt;&lt;span style="color: green"&gt;繰り返し部分の取得実体
        &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name="url"&amp;gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
        &lt;/span&gt;&lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;&amp;gt; GetResultCore(&lt;span style="color: blue"&gt;string &lt;/span&gt;url)
        {
            &lt;span style="color: green"&gt;//取得ループ開始
            &lt;/span&gt;&lt;span style="color: blue"&gt;while &lt;/span&gt;(&lt;span style="color: blue"&gt;true&lt;/span&gt;)
            {
                &lt;span style="color: blue"&gt;var &lt;/span&gt;executeUrl = url + &lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;"&amp;amp;start={0}&amp;amp;count=30"&lt;/span&gt;, index + 1);

                &lt;span style="color: blue"&gt;var &lt;/span&gt;element = &lt;span style="color: #2b91af"&gt;XDocument&lt;/span&gt;.Load(executeUrl);

                &lt;span style="color: green"&gt;//エラーチェック
                &lt;/span&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;error = element.Descendants(&lt;span style="color: #a31515"&gt;"{http://webservice.recruit.co.jp/HotPepper/}error"&lt;/span&gt;).FirstOrDefault();
                &lt;span style="color: blue"&gt;if &lt;/span&gt;(error != &lt;span style="color: blue"&gt;null&lt;/span&gt;) &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;InvalidQueryException&lt;/span&gt;(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Error&lt;/span&gt;(error).Message);

                &lt;span style="color: green"&gt;//クエリー条件にマッチする、検索結果の全件数
                &lt;/span&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;total = element.Descendants(&lt;span style="color: #a31515"&gt;"{http://webservice.recruit.co.jp/HotPepper/}results_available"&lt;/span&gt;).FirstOrDefault();
                &lt;span style="color: green"&gt;// このＸＭＬに含まれる検索結果の件数クエリー条件にマッチする、検索結果の全件数
                &lt;/span&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;returned = element.Descendants(&lt;span style="color: #a31515"&gt;"{http://webservice.recruit.co.jp/HotPepper/}results_returned"&lt;/span&gt;).FirstOrDefault();
                &lt;span style="color: green"&gt;//結果がなければ終了
                &lt;/span&gt;&lt;span style="color: blue"&gt;if &lt;/span&gt;(total == &lt;span style="color: blue"&gt;null &lt;/span&gt;|| total.Value == &lt;span style="color: #a31515"&gt;"0" &lt;/span&gt;|| returned == &lt;span style="color: blue"&gt;null &lt;/span&gt;|| returned.Value == &lt;span style="color: #a31515"&gt;"0"&lt;/span&gt;) &lt;span style="color: blue"&gt;yield break&lt;/span&gt;;

                &lt;span style="color: blue"&gt;var &lt;/span&gt;collection = element.Descendants(&lt;span style="color: #a31515"&gt;"{http://webservice.recruit.co.jp/HotPepper/}" &lt;/span&gt;+ name);

                &lt;span style="color: blue"&gt;var &lt;/span&gt;limit = &lt;span style="color: blue"&gt;int&lt;/span&gt;.Parse(total.Value);

                &lt;span style="color: blue"&gt;if &lt;/span&gt;(takeCount.HasValue) limit = takeCount.Value + start;

                &lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: blue"&gt;var &lt;/span&gt;item &lt;span style="color: blue"&gt;in &lt;/span&gt;collection)
                {
                    index++;
                    &lt;span style="color: blue"&gt;if&lt;/span&gt;(index &amp;gt; limit) &lt;span style="color: blue"&gt;yield break&lt;/span&gt;;
                    &lt;span style="color: blue"&gt;yield return &lt;/span&gt;item;
                }
            }
        }
    }
}
ひとまずこれで完成。&lt;/pre&gt;&lt;pre class="code"&gt;&lt;iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; padding-right: 0px; padding-top: 0px" title="Preview" height="120" marginheight="0" src="https://skydrive.live.com/embed?cid=FB3A5BA8F459C9C9&amp;amp;resid=FB3A5BA8F459C9C9%21354&amp;amp;authkey=AFBqE3BJfITo_gg" frameborder="0" width="98" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;
&lt;/pre&gt;&lt;pre class="code"&gt;他のWebServiceもこれらをベースにすればLinq化するのも楽かもしれません。まぁWebはXML or JSONで十分って気がしないでもないですが^^;&lt;/pre&gt;&lt;img src ="http://blogs.wankuma.com/kokuryu/aggbug/249830.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>黒龍</dc:creator><title>Linq to 色々その３．汎用的な呼び出しのベースを作成する。</title><link>http://blogs.wankuma.com/kokuryu/archive/2012/01/09/247619.aspx</link><pubDate>Mon, 09 Jan 2012 01:32:00 GMT</pubDate><guid>http://blogs.wankuma.com/kokuryu/archive/2012/01/09/247619.aspx</guid><wfw:comment>http://blogs.wankuma.com/kokuryu/comments/247619.aspx</wfw:comment><comments>http://blogs.wankuma.com/kokuryu/archive/2012/01/09/247619.aspx#Feedback</comments><slash:comments>33</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kokuryu/comments/commentRss/247619.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kokuryu/services/trackbacks/247619.aspx</trackback:ping><description>&lt;p&gt;前回（&lt;a href="http://blogs.wankuma.com/kokuryu/archive/2012/01/05/246371.aspx"&gt;Linq to 色々その２&lt;/a&gt;）、前々回（&lt;a href="http://blogs.wankuma.com/kokuryu/archive/2012/01/04/246365.aspx"&gt;Linq to 色々&lt;/a&gt;）に引き続きIQueryableの残りを作っていきます。&lt;/p&gt; &lt;p&gt;Where句を抽出してWeb Serviceのパラメータとするところまでは概ねうまくいっていたのですが気になる現象がみられました。&lt;/p&gt; &lt;p&gt;それはWhere指定した条件が最終的な列挙にも使用されているという現象です。（なので結果セットを作るところでkeywordとかを詰めなおしていた）&lt;/p&gt; &lt;p&gt;これはExpressionTreeからWhereを評価後に該当するWhere句を取っ払ってしまえばよく、そのためのExpressionTreeModifier&amp;lt;T&amp;gt;というクラスが存在していますので中身にWhere句部分を取っ払うようにしてみましょう。&lt;/p&gt; &lt;p&gt;Where句というのはWhereの抽出で行っていた中身にあるように実質はWhereメソッドの呼び出しになります。（Argument[0]が後続のSelect等のクエリ、Argument[1]がWhereの条件部分）なのでここをWhereの抽出時同様にVisitMethodCallをオーバライドするようにしましょう。こうすれば結果セットに対してのWhereはかからなくなるので期待通り結果のみつめればよくなります。&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;protected override &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Expression &lt;/span&gt;VisitMethodCall(&lt;span style="color: #2b91af"&gt;MethodCallExpression &lt;/span&gt;node)
{
    &lt;span style="color: blue"&gt;if &lt;/span&gt;(node.Method.Name == &lt;span style="color: #a31515"&gt;"Where"&lt;/span&gt;)
        &lt;span style="color: blue"&gt;return &lt;/span&gt;Visit(node.Arguments[0]);
    &lt;span style="color: blue"&gt;return base&lt;/span&gt;.VisitMethodCall(node);
}
&lt;/pre&gt;
&lt;p&gt;で、いよいよ大物のグルメサーチAPIと行きたいところですがマスタ類も結局は必要になるので先にかたずけるとしましょう。前回ページング対応のものは作ったのですが同じ形でAPI毎に作るというのも面倒なのでほとんどのマスタ系呼び出しに共通するページングなしのQueryProviderを作成しましょう。&lt;/p&gt;
&lt;p&gt;やりたいこととしては&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;URLを切り替えれるよう&lt;em&gt;にする&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;結果&lt;/em&gt;のXMLから&lt;em&gt;抽出するタグ名を指定できるように&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;検索条件があれば指定できるように&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;あたりの事が出来ればひとまずよさそうです。というわけで。。。&lt;/em&gt;&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Collections.Generic;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Linq;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Text;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Linq.Expressions;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Xml.Linq;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Xml;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Net;

&lt;span style="color: blue"&gt;namespace &lt;/span&gt;LinqToHotpepper
{
    &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;
    /// &lt;/span&gt;&lt;span style="color: green"&gt;ファクトリクラス
    &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;
    &lt;/span&gt;&lt;span style="color: blue"&gt;public static class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;SimpleQueryProvider
    &lt;/span&gt;{
        &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;
        /// &lt;/span&gt;&lt;span style="color: green"&gt;ファクトリメソッド
        &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name="apiKey"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;発行されたAPIキー&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="baseUrl"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;リクエストURL&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="name"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;抽出対象のXML要素名&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="builder"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;結果のファクトリ&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        &lt;/span&gt;&lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;SimpleQueryProvider&lt;/span&gt;&amp;lt;T&amp;gt; Create&amp;lt;T&amp;gt;(&lt;span style="color: blue"&gt;string &lt;/span&gt;apiKey, &lt;span style="color: blue"&gt;string &lt;/span&gt;baseUrl, &lt;span style="color: blue"&gt;string &lt;/span&gt;name, &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;&amp;gt;, T&amp;gt; builder)
        {
            &lt;span style="color: blue"&gt;return new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;SimpleQueryProvider&lt;/span&gt;&amp;lt;T&amp;gt;(apiKey, baseUrl, name, builder, &lt;span style="color: blue"&gt;null&lt;/span&gt;);
        }
        &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;
        /// &lt;/span&gt;&lt;span style="color: green"&gt;ファクトリメソッド
        &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name="apiKey"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;発行されたAPIキー&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="baseUrl"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;リクエストURL&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="name"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;抽出対象のXML要素名&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="builder"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;結果のファクトリ&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="finder"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;要素から抽出を行うFinder&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        &lt;/span&gt;&lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;SimpleQueryProvider&lt;/span&gt;&amp;lt;T&amp;gt; Create&amp;lt;T&amp;gt;(&lt;span style="color: blue"&gt;string &lt;/span&gt;apiKey, &lt;span style="color: blue"&gt;string &lt;/span&gt;baseUrl, &lt;span style="color: blue"&gt;string &lt;/span&gt;name, &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;&amp;gt;, T&amp;gt; builder, &lt;span style="color: #2b91af"&gt;EqualsFinder&lt;/span&gt;&amp;lt;T&amp;gt; finder)
        {
            &lt;span style="color: blue"&gt;return new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;SimpleQueryProvider&lt;/span&gt;&amp;lt;T&amp;gt;(apiKey, baseUrl, name, builder, finder);
        }
    }
    &lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;SimpleQueryProvider&lt;/span&gt;&amp;lt;T&amp;gt; : &lt;span style="color: #2b91af"&gt;QueryProviderBase&lt;/span&gt;&amp;lt;T&amp;gt;
    {
        &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;発行されたAPIキー&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;
        &lt;/span&gt;&lt;span style="color: blue"&gt;private string &lt;/span&gt;key;
        &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;リクエストURL&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;
        &lt;/span&gt;&lt;span style="color: blue"&gt;private string &lt;/span&gt;baseUrl;
        &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;要素から抽出を行うFinder&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;
        &lt;/span&gt;&lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EqualsFinder&lt;/span&gt;&amp;lt;T&amp;gt; finder;
        &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;抽出対象のXML要素名&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;
        &lt;/span&gt;&lt;span style="color: blue"&gt;private string &lt;/span&gt;name;
        &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;結果セットのファクトリ&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;
        &lt;/span&gt;&lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;&amp;gt;, T&amp;gt; resultBuilder;

        &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;
        /// &lt;/span&gt;&lt;span style="color: green"&gt;コンストラクタ
        &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name="apiKey"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;発行されたAPIキー&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="baseUrl"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;リクエストURL&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="name"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;抽出対象のXML要素名&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="builder"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;結果のファクトリ&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="finder"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;要素から抽出を行うFinder&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        &lt;/span&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;SimpleQueryProvider(&lt;span style="color: blue"&gt;string &lt;/span&gt;apiKey, &lt;span style="color: blue"&gt;string &lt;/span&gt;baseUrl, &lt;span style="color: blue"&gt;string &lt;/span&gt;name, &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;&amp;gt;, T&amp;gt; builder, &lt;span style="color: #2b91af"&gt;EqualsFinder&lt;/span&gt;&amp;lt;T&amp;gt; finder)
        {
            &lt;span style="color: blue"&gt;this&lt;/span&gt;.key = apiKey;
            &lt;span style="color: blue"&gt;this&lt;/span&gt;.baseUrl = baseUrl;
            &lt;span style="color: blue"&gt;this&lt;/span&gt;.name = name;
            &lt;span style="color: blue"&gt;this&lt;/span&gt;.resultBuilder = builder;
            &lt;span style="color: blue"&gt;this&lt;/span&gt;.finder = finder;
        }
        &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;
        /// &lt;/span&gt;&lt;span style="color: green"&gt;パラメータチェック
        &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name="finder"&amp;gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
        &lt;/span&gt;&lt;span style="color: blue"&gt;private bool &lt;/span&gt;IsValidParameter(&lt;span style="color: #2b91af"&gt;EqualsFinder&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;ShopResult&lt;/span&gt;&amp;gt; finder)
        {
            &lt;span style="color: blue"&gt;return true&lt;/span&gt;;
        }

        &lt;span style="color: blue"&gt;protected override &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; GetResult(&lt;span style="color: #2b91af"&gt;Expression &lt;/span&gt;expression)
        {
            &lt;span style="color: blue"&gt;var &lt;/span&gt;sb = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;StringBuilder&lt;/span&gt;(baseUrl);
            sb.AppendFormat(&lt;span style="color: #a31515"&gt;"?key={0}"&lt;/span&gt;, key);
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(finder != &lt;span style="color: blue"&gt;null&lt;/span&gt;)
            {
                finder.Expression = expression;
                &lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: blue"&gt;var &lt;/span&gt;item &lt;span style="color: blue"&gt;in &lt;/span&gt;finder.Results)
                {
                    sb.AppendFormat(&lt;span style="color: #a31515"&gt;"&amp;amp;{0}={1}"&lt;/span&gt;, item.Key, item.Value);                    
                }
            }

            &lt;span style="color: blue"&gt;var &lt;/span&gt;element = &lt;span style="color: #2b91af"&gt;XDocument&lt;/span&gt;.Load(sb.ToString());

            &lt;span style="color: green"&gt;//エラーチェック
            &lt;/span&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;error = element.Descendants(&lt;span style="color: #a31515"&gt;"{http://webservice.recruit.co.jp/HotPepper/}error"&lt;/span&gt;).FirstOrDefault();
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(error != &lt;span style="color: blue"&gt;null&lt;/span&gt;) &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;InvalidQueryException&lt;/span&gt;(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Error&lt;/span&gt;(error).Message);

            &lt;span style="color: blue"&gt;var &lt;/span&gt;collection = element.Descendants(&lt;span style="color: #a31515"&gt;"{http://webservice.recruit.co.jp/HotPepper/}" &lt;/span&gt;+ name);

            &lt;span style="color: blue"&gt;yield return &lt;/span&gt;resultBuilder(collection);
        }
    }
}

&lt;/pre&gt;
&lt;p&gt;&lt;span style="color: #2b91af"&gt;SimpleQueryProvider&lt;/span&gt;&amp;lt;T&amp;gt;ですが&lt;span style="color: #2b91af"&gt;QueryProviderBase&lt;/span&gt;&amp;lt;T&amp;gt; （abstractだったので&lt;span style="color: #2b91af"&gt;QueryProvider&lt;/span&gt;から&lt;span style="color: #2b91af"&gt;QueryProviderBase&lt;/span&gt;に名称変えました）をシンプルに実装しただけですね。同名の&lt;span style="color: #2b91af"&gt;SimpleQueryProvider&lt;/span&gt;クラスは&lt;span style="color: #2b91af"&gt;SimpleQueryProvider&lt;/span&gt;&amp;lt;T&amp;gt;に対するファクトリです。ジェネリッククラスのコンストラクタはいちいち&amp;lt;T&amp;gt;を書かないとダメなんですがジェネリックメソッドは引数からの型推論が効くのでジェネリックメソッドにはだいたい作っちゃうことが多いです。&lt;/p&gt;
&lt;p&gt;こうすることでnew Query&amp;lt;ResultBase&amp;lt;CodeName&amp;gt;&amp;gt;(new SimpleQueryProvider&amp;lt;ResultBase&amp;lt;CodeName&amp;gt;&amp;gt;(...&lt;/p&gt;
&lt;p&gt;なんて書き方がQuery.Create(SimpleQueryProvider.Create(...ですんじゃうので。で、呼び出し方はそのまんまですが&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;foodQuery = &lt;span style="color: #2b91af"&gt;Query&lt;/span&gt;.Create(&lt;span style="color: #2b91af"&gt;SimpleQueryProvider&lt;/span&gt;.Create(
            &amp;lt;APIキー&amp;gt;,
            &lt;span style="color: #a31515"&gt;"http://webservice.recruit.co.jp/hotpepper/food/v1/"&lt;/span&gt;,
            &lt;span style="color: #a31515"&gt;"food"&lt;/span&gt;,
             x =&amp;gt; &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;FoodResult&lt;/span&gt;()
             {
                 Results = x.Select(_ =&amp;gt; &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Food&lt;/span&gt;(_))
             },
             &lt;span style="color: #2b91af"&gt;EqualsFinder&lt;/span&gt;.Creater((&lt;span style="color: #2b91af"&gt;FoodResult &lt;/span&gt;_) =&amp;gt; _.code
                , _ =&amp;gt; _.keyword,
                _ =&amp;gt; _.food_category)));
&lt;span style="color: blue"&gt;var &lt;/span&gt;query = &lt;span style="color: blue"&gt;from &lt;/span&gt;result &lt;span style="color: blue"&gt;in &lt;/span&gt;foodQuery
            &lt;span style="color: blue"&gt;from &lt;/span&gt;food &lt;span style="color: blue"&gt;in &lt;/span&gt;result.Results
            &lt;span style="color: blue"&gt;where &lt;/span&gt;result.keyword == &lt;span style="color: #a31515"&gt;"料理"
            &lt;/span&gt;&lt;span style="color: blue"&gt;select &lt;/span&gt;food;

&lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: blue"&gt;var &lt;/span&gt;item &lt;span style="color: blue"&gt;in &lt;/span&gt;query)
{
    System.Diagnostics.&lt;span style="color: #2b91af"&gt;Debug&lt;/span&gt;.WriteLine(item.Name);
}
&lt;/pre&gt;
&lt;p&gt;みたいな感じにすることでOK。ページング対応の部分も必要なので前回のShopInfoQueryProviderをもとに今回のような汎用的な検索のページングバージョンを作成しましょう。&lt;/p&gt;
&lt;p&gt;長くなったので続く。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kokuryu/aggbug/247619.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>