LINQ 可以查询对象集合(object collection)、SQL、实体(entities)和 XML。想要扩展它的功能,有两种选择:实现一个自定义的 LINQ Provider,或者将待查询目标转换成已有实现的一种。第二种方案通常比较容易实现,Bing API演示了使用 LINQ 将 XML结果转换成自定义对象的过程,代码如下:
internal class SearchResult
{
public string Title { get; set; }
public string Url { get; set; }
public string Description { get; set; }
}
internal class Bing
{
public string AppId { get; set; }
private const string BingNameSpace = "http://schemas.microsoft.com/LiveSearch/2008/04/XML/web";
public Bing(string appId)
{
this.AppId = appId;
}
public IEnumerable<SearchResult> QueryWeb(string query)
{
string escaped = Uri.EscapeUriString(query);
string url = BuildUrl(escaped);
XDocument doc = XDocument.Load(url);
XNamespace ns = BingNameSpace;
IEnumerable<SearchResult> results =
from sr in doc.Descendants(ns + "WebResult")
select
new SearchResult
{
Title = sr.Element(ns + "Title").Value,
Url = sr.Element(ns + "Url").Value,
Description = sr.Element(ns + "Description").Value
};
return results;
}
private string BuildUrl(string query)
{
return "http://api.search.live.net/xml.aspx?" + "AppId=" + AppId +
"&Query=" + query + "&Sources=Web" +
"&Version=2.0" + "&Web.Count=10" + "&Web.Offset=0";
}
}
internal class LinqToBing
{
//#error Get your own AppId at http://www.bing.com/developers/
private const string AppId = "YOUR APPID HERE";
private static void Main(string[] args)
{
Bing search = new Bing(AppId);
string query = "Visual Studio 2010";
IEnumerable<SearchResult> results = search.QueryWeb(query);
foreach (SearchResult result in results)
{
Console.WriteLine(
"{0}" + Environment.NewLine + "\t{1}" + Environment.NewLine +
"\t{2}" + Environment.NewLine,
result.Title, result.Url, result.Description);
}
Console.ReadKey();
}
}