2

別の結果ページに移動できるように、Bing 検索 (Web 結果のみ) プロキシに追加しようとしています。パラメータ $skip を使用することになっていることはわかっていますが、ドル記号が含まれているため、URL を正しく出力できません。

間違って表示することしかできません (&: の後にドル記号が必要です)。

https://api.datamarket.azure.com/Data.ashx/Bing/SearchWeb/Web()?Query= 'xbox'&Page=2

...または、次のエラーを教えてください:

{Linq 式を URI に変換中にエラーが発生しました: 予約文字 '$' で始まっているため、クエリ オプション '$Page' を追加できません。}

これが私のコードです(私の追加は一番下にあります)。どんな助けでも大歓迎です。ありがとう!

    public BingSearchContainer(Uri serviceRoot) : 
            base(serviceRoot) {
    }

    /// <summary>
    /// </summary>
    /// <param name="Query">Bing search query Sample Values : xbox</param>
    /// <param name="Market">Market. Note: Not all Sources support all markets. Sample Values : en-US</param>
    /// <param name="Adult">Adult setting is used for filtering sexually explicit content Sample Values : Moderate</param>
    /// <param name="Latitude">Latitude Sample Values : 47.603450</param>
    /// <param name="Longitude">Longitude Sample Values : -122.329696</param>
    /// <param name="WebFileType">File extensions to return Sample Values : XLS</param>
    public DataServiceQuery<WebResult> Web(String Query, String Market, String Adult, Double? Latitude, Double? Longitude, String WebFileType, String Page) {
        if ((Query == null)) {
            throw new System.ArgumentNullException("Query", "Query value cannot be null");
        }
        DataServiceQuery<WebResult> query;
        query = base.CreateQuery<WebResult>("Web");
        if ((Query != null)) {
            query = query.AddQueryOption("Query", string.Concat("\'", System.Uri.EscapeDataString(Query), "\'"));
        }
        if ((Market != null)) {
            query = query.AddQueryOption("Market", string.Concat("\'", System.Uri.EscapeDataString(Market), "\'"));
        }
        if ((Adult != null)) {
            query = query.AddQueryOption("Adult", string.Concat("\'", System.Uri.EscapeDataString(Adult), "\'"));
        }
        if (((Latitude != null) 
                    && (Latitude.HasValue == true))) {
            query = query.AddQueryOption("Latitude", Latitude.Value);
        }
        if (((Longitude != null) 
                    && (Longitude.HasValue == true))) {
            query = query.AddQueryOption("Longitude", Longitude.Value);
        }
        if ((WebFileType != null)) {
            query = query.AddQueryOption("WebFileType", string.Concat("\'", System.Uri.EscapeDataString(WebFileType), "\'"));
        }
        if ((Page != null))
        {
            query = query.AddQueryOption("Page", Page);
        }
        return query;
    }
}
4

2 に答える 2

6

解決策はかなり単純です。

  • BingSearchContainer はそのままにしておきます
  • AddQueryOption 関数を使用して、ページングおよびスキップ オプションを追加します。

次のコードを使用して、searchcontainer を呼び出します。

            var imageQuery = bingContainer.Image("XBOX" , null, null, null, null, null, null);
            imageQuery = imageQuery.AddQueryOption("$top", 20);
            imageQuery = imageQuery.AddQueryOption("$skip", 20);
于 2012-08-26T15:11:33.417 に答える
0

何らかの理由で、markwildeの回答は直接機能しませんでしたが、同様の問題を解決する方法がわかりました。最新バージョンのBingSearchContainer / APIでは、上記の手法を使用してオプション$top$skipが追加されませんでした。驚いたのですが、調査する時間がなかったので、次のようなもっと残忍なテクニックを使いました。

私の場合、null以外のパラメーターをbingContainter.Image(...)メソッドに渡しており、これらは問題なく追加されましたが、AddQueryOptionメソッドを使用して$top$skipを追加しようとすると、これらのオプションは追加されませんでした。したがって、私が行ったことは、bingContainer.Image(...)を変更して、$top値と$skip値を渡し、そのメソッド内に追加することでした。

public DataServiceQuery<ImageResult> Image(String Query, String Options, String Market, String Adult, Double? Latitude, Double? Longitude, String ImageFilters, int? top, int? skip ) {
        if ((Query == null)) {
            throw new System.ArgumentNullException("Query", "Query value cannot be null");
        }
        DataServiceQuery<ImageResult> query;
        query = base.CreateQuery<ImageResult>("Image");
        if ((Query != null)) {
            query = query.AddQueryOption("Query", string.Concat("\'", System.Uri.EscapeDataString(Query), "\'"));
        }
        if ((Options != null)) {
            query = query.AddQueryOption("Options", string.Concat("\'", System.Uri.EscapeDataString(Options), "\'"));
        }
        if ((Market != null)) {
            query = query.AddQueryOption("Market", string.Concat("\'", System.Uri.EscapeDataString(Market), "\'"));
        }
        if ((Adult != null)) {
            query = query.AddQueryOption("Adult", string.Concat("\'", System.Uri.EscapeDataString(Adult), "\'"));
        }
        if (((Latitude != null) 
                    && (Latitude.HasValue == true))) {
            query = query.AddQueryOption("Latitude", Latitude.Value);
        }
        if (((Longitude != null) 
                    && (Longitude.HasValue == true))) {
            query = query.AddQueryOption("Longitude", Longitude.Value);
        }
        if ((ImageFilters != null)) {
            query = query.AddQueryOption("ImageFilters", string.Concat("\'", System.Uri.EscapeDataString(ImageFilters), "\'"));
        }
        if (((top != null)
                    && (top.HasValue == true)))
        {
            query = query.AddQueryOption("$top", top.Value);
        }
        if (((skip != null)
                    && (skip.HasValue == true)))
        {
            query = query.AddQueryOption("$skip", skip.Value);
        }
        return query;
    }

Microsoftはこのクラスを頻繁に変更しているように思われるため、これは将来的に機能する場合と機能しない場合があります。

于 2012-09-05T14:50:27.650 に答える