将分页功能添加到 DataServiceQuery for Bing Search API
本文关键字:for Bing Search API DataServiceQuery 分页 功能 添加 | 更新日期: 2023-09-27 18:37:17
我正在尝试添加到必应搜索(仅限 Web 结果)代理,以便我可以转到不同的结果页面。我知道我应该使用参数 $skip,但由于它有一个美元符号,所以我无法让它正确输出 URL。
我只能让它显示不正确(它需要在 &: 之后使用美元符号:
https://api.datamarket.azure.com/Data.ashx/Bing/SearchWeb/Web()?查询='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;
}
}
解决方案相当简单。
- 保持必应搜索容器不变
- 并添加分页和跳过使用添加查询选项函数的选项
使用以下代码调用搜索容器。
var imageQuery = bingContainer.Image("XBOX" , null, null, null, null, null, null);
imageQuery = imageQuery.AddQueryOption("$top", 20);
imageQuery = imageQuery.AddQueryOption("$skip", 20);
出于某种原因,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似乎经常更改此类,因此将来这可能对您有用,也可能不起作用。