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没有使用上述技术添加,这让我很惊讶,但我没有时间调查,所以我使用了以下更残酷的技术。

就我而言,我将一些非空参数传递给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 回答