65.9K
CodeProject 正在变化。 阅读更多。
Home

在 ASP.NET 中使用 LINQ-to-Wiki 查询维基百科

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2013年4月23日

CPOL

5分钟阅读

viewsIcon

20900

在 ASP.NET 中使用 LINQ-to-Wiki 查询维基百科。

您是否曾访问过维基百科,却被其中浩瀚的知识海洋所淹没?如果有一种方法可以让您轻松创建复杂的查询,并以熟悉的语法(*例如 LINQ*)提供您所需的一切,那就太好了?那么这篇帖子可能正是为您准备的!

介绍 LINQ-to-Wiki

LINQ-to-Wiki 是由 Petr Onderka 设计的一个库,用于通过任何可用的 .NET 语言查询任何运行 MediaWiki 的网站(*包括维基百科*)。它提供了丰富的功能,可以执行复杂的查询,并且不仅限于读取维基页面,还可以执行编辑、内容添加等操作。您可以请求各种不同的项目,而这些项目通常需要大量的滚动、点击,并最终导致“我是怎么到这里的”几个小时后才恍然大悟。所有这一切都发生在你因为该网站可能引起的知识的庞大数量和近乎成瘾的吸引力而偏离了最初的目标之后。

通过 LINQ-to-Wiki 中的查询可以访问的与维基百科内容相关的许多事物包括:

  • 列出类别中的所有文章
  • 列出页面中包含的所有链接
  • 获取图片和相关文章
  • 完整的查询和搜索支持

LINQ-to-Wiki 使用任何 .NET 开发人员都熟悉的传统 LINQ 查询,然后该库将其转换为 MediaWiki 的 API 请求,以实现您试图征服世界的宏伟计划。

入门

可以通过以下两种方法访问 LINQ-to-Wiki:

  • 直接在此处下载 LINQ-to-Wiki 文件:此处
  • 通过 NuGet 将 LINQ-to-Wiki 包添加到您的项目中。

一旦您将适当的引用添加到 LINQ-to-Wiki 文件到您的项目中,您就可以开始了!

您的第一个查询

查询正是 LINQ-to-Wiki 发光发热的地方(*正如您可以想象的,维基百科拥有浩瀚的数据*)!实际的查询过程非常直接,与您在任何其他 LINQ-to-X(*SQL、Entities 等*)中习惯使用的传统 DataContext 没什么区别。

您首先需要初始化一个 Wiki 类,它将充当您的 DataContext 和所有查询的源。您可以使用实际的登录信息(*如果您计划进行编辑和执行更高级的操作*)来初始化它,但在本演示中,我们将只关注查询,所以请随意创建您自己的凭据。

var wikipedia = new Wiki("Example");

一旦您创建了必要的 Wiki 对象,您基本上就可以开始查询了。然而,维基百科是一个庞大、复杂且充满数据的宇宙,在我们乘坐 LINQ 动力飞船进行探险之前,让我们先看一张地图,看看我们可以去哪里。

探索维基百科的宇宙

在我们深入进行一些严肃的查询之前,让我们回顾一下我们可以从 Wiki 对象中使用的属性和集合。由于这篇帖子主要关注查询,我们将查看 Wiki 对象的 Query 属性。

var query = wikipedia.Query.AdventurePlaceholder;

在查询 Query 对象时,我们将重点关注的一些主要属性是:

  • allcategories – *这是所有可用类别的枚举*
  • allimages - *这是所有可用图片的枚举*
  • alllinks - *这是所有可用链接的枚举*
  • categorymembers – *列出给定类别中的所有页面*
  • backlinks – *查找链接回特定页面的所有页面。*
  • search – *允许执行全文搜索*

对于以上每一项,我们都可以使用我们所熟知的 LINQ 方法,例如 .Where() 和 .Select(),然后我们将其包装起来,使用 .AsEnumerable() 方法执行我们的查询。这些项目中的每一个在您的内部子句中也有特定的属性可以访问,以进一步缩小搜索范围,因此不要忽视 IntelliSense 的强大功能。

启程飞向宇宙(*终于!*)

那么,让我们从一个简单的查询开始,让自己起飞。我们将查询维基百科上所有以“Microsoft”开头的图片,并返回每个图片的标题。

//This will retrieve all of the images that begin with "Microsoft" (using the built-in prefix property) and select the title of each.
var query = wikipedia.Query.allimages().Where(i => i.prefix == "Microsoft").Select(s => s.title).ToEnumerable();

就这样!使用 MVC 中的一个简单的 Controller Action(*在此示例中*),我们可以将每个结果输出到视图中的一个基本列表中。

public ActionResult QueryWiki()
{
     var wikipedia = new Wiki("Example")
     var query = wikipedia.Query.allimages().Where(i => i.prefix == "Microsoft").Select(s => s.title).ToEnumerable();
     return View(query);
}

以及这个简单的视图

<ul>
     @foreach (var image in Model){
         <li>@image</li> 
     }
</ul>

将产生一个庞大的(*而且非常丑陋*)列表,其中包含维基百科上所有以“Microsoft”开头的图片。

"Microsoft" Wikipedia Image Results

包含所有以“Microsoft”开头的维基百科图片的查询结果

让我们稍微调整一下(*因为只有文字很无聊*)

通过提取图片标题之外的其他属性,让事物在视觉上更具吸引力。我们可以使用图片中可用的 url、height 和 width 属性来创建一个类似的列表,该列表将展示这些项目的图片,而不是一个普通的无序列表。

首先,我们将创建一个非常简单的类来存储我们关心的属性,以便将其传递到视图中显示。

public class WikiImage
{
     public string Url { get; set; }
     public int Height { get; set; }
     public int Width { get; set; }
     //Simple Constructor
     public WikiImage(string url, int height, int width)
     {
          Url = url;
          Height = height;
          Width = width;
     }
}

使用我们新的、改进的查询(*该查询将从我们的图片中选择 url、height 和 width 属性*)

var query = wikipedia.Query.allimages()
            .Where(i => i.prefix == "Microsoft")
            .Select(s => new WikiImage(s.url,s.height,s.width)).ToList();

以及对视图进行的一些微小调整(*控制器操作基本保持不变*),

@foreach (var image in Model){
     <img src='@image.Url' height='@image.Height' width='@image.Width' /><br />
}

会得到我们的结果……

(呃,结果太大了,无法轻松全屏显示。我将在视图中调整高度和宽度以提供更好的示例)

*咳咳* 并且会得到我们的结果!

A Ton of Microsoft Square Images

从我们新的查询中获取维基百科上所有以“Microsoft”开头的图片的结果

更多复杂功能即将推出!

这篇帖子只是展示了使用 LINQ-to-Wiki 可以做的一些简单事情。下次,我们将介绍使用更高级的功能,例如使用 PageResults 来创建更复杂的查询并提取更多数据,还有什么谁知道呢!

更多信息 *(如果您迫不及待想深入了解)*

如果您有兴趣了解更多关于 LINQ-to-Wiki 的信息,请访问 github 页面,您可以在其中找到大量的文档,详细介绍了您可以查询的每个单独的方法和属性。我还强烈推荐下载 LINQ-to-Wiki 示例项目,其中包含各种示例供您入门。

您也可以从下面的链接从 github 下载此示例

© . All rights reserved.