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

LINQPad,开发者最好的朋友

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (5投票s)

2018年11月13日

CPOL

14分钟阅读

viewsIcon

14800

LINQPad - 开发者的好朋友。

引言

在这篇文章中,我将讨论一个对我来说不可或缺的工具(也是应广大读者要求 :D)。从测试想法到开发自定义控件,我大部分时间都使用 LINQPad,而且不仅仅是用于“开发”主题。

警告,一大段文字即将到来 😀

我们将深入了解它是什么,以及你可以用它做些什么。

那么,什么是 LINQPad

LINQPad 听起来可能像一个只用于 LINQ 的工具,但它远不止于此。

它是免费使用的,尽管免费版缺少一些让你的生活更加便利的功能,我认为它值得付费购买许可证,尤其是使用高级许可证进行调试的功能。请注意,除了可用性功能外,如果你不需要“智能感知”类功能、Nuget 包、调试和跨数据库查询(是的,你可以查询多个数据库),那么你不需要购买许可证。有关许可证提供的完整功能列表,你可以 在这里 查看。

编程技术

现在进入有趣的部分,你可以使用以下技术编写、编译和运行任何代码(以及行内解释的不同模式):

  • C#
    • 表达式 – 允许你编写一个单独的表达式进行求值。表达式在数据库查询或只想运行一段代码看看会发生什么时非常有用,例如获取所有正在运行的进程、读取文件、将某些 DateTime 转换为不同的时区、进行计算等。在此模式下,表达式不需要以分号结尾,但在最新版本中,如果你在表达式末尾加上分号,它会将模式更改为“语句”,这是可配置的。
    • 语句 – 允许你编写和运行多行代码。想象一下你在一个方法中编写所有这些行,我大部分时间都在 LINQPad 中使用这种模式,因为大多数“脚本”只是一组不需要复杂结构的指令。
    • 程序 – 这将为你提供一个“Main”方法,你可以在其中放置代码,并在其范围之外定义自定义类和方法来进行实验和玩耍。当你想要设计类层次结构、使用事件驱动的 API、设计自定义控件(WebForms 或 WPF 都支持)以及任何你在典型类项目中可以做的事情时,程序模式都非常出色。缺点是,如果结构非常复杂,它将不得不放在一个文件中(有一些绕过方法,例如将这些类编译成程序集并引用它们),因此它会变得混乱。
    • 附注:如果你处于语句或程序模式,并且选中了一部分代码并单击“运行”,那么它将只运行选定的部分,就像 SQL Server Manager 对查询所做的那样,如果你熟悉它的话。
  • VB.NET
    • 表达式 – 同上
    • 语句 – 同上
    • 程序 – 同上
  • SQL – 这允许你针对数据库编写原始 SQL 语句,因此本质上,你拥有比 SQL Server Manager 更轻量级的 SQL IDE。
  • ESQL – 我从未使用过这种模式,但据我所知,它是一种让 SQL 与自定义类型和应用程序逻辑协同工作的方式,无论如何,至少它是一个选项 🙂
  • F#
    • 表达式 – 同上
    • 程序 – 同上

另外值得一提的是,最新的 LINQPad 支持最新版本的 .NET。包括其所有便利的功能,如 string 插值、元组、异步、本地函数等。

数据上下文连接

LINQPad 支持各种各样的数据上下文。我之所以不称它们为数据库,是因为除了可以直接连接到 MS SQL 和 Azure SQL 之外,还有很多其他连接数据提供商的方式,有些是开箱即用的(如支持 WCF 数据服务和 Entity Framework),有些是由社区创建的(如将 CSV 和 JSON 文件视为数据存储以及像 Raven 和 Mongo 这样的 NoSQL 数据库)。

最棒的是,你可以创建自己的数据上下文,然后将其安装到 LINQPad 中,如果你找不到所需的提供程序(这里不详细介绍如何创建,Github 上有很多示例)。

查询和示例

LINQPad 的另一个重要特点是,所有内容都保存为特定的文件格式(基本上是一个带有 XML 头的文本文件),这允许你保存编写的代码并供以后重用。如果我将 LINQPad 中编写的每个脚本都保存到控制台项目中,我会疯掉的,如果你不相信,试试在 Github 上搜索 LINQPad,你会看到成页的存储库专门用于这些脚本,别无他物。

默认情况下,你会得到一个名为“我的扩展”的查询,你可以在其中保存想要在常规查询中重用的方法、类和扩展方法,基本上,这是一个所有查询都引用的文件。

在我们转向示例之前,最后一个要点是,你可以打开任何已打开的查询,然后单击“文件”菜单中的“上传到即时共享”。单击此按钮将上传你的脚本并为你提供一个 URL,你可以与他人共享,如果你想像这样发送给他们。在此要特别注意,该 URL 是公开的,据我所知,只有通过该 URL 才能撤销,因此请注意你分享的内容。要打开收到的 URL,你可以单击“文件”菜单下的“打开”并粘贴 URL,或者直接在浏览器中打开,它会将脚本下载到你的计算机。

至于示例,这些是已经为你编写好的示例脚本,你可以免费下载更多。我通常会下载所有示例,然后可以在其中进行搜索,例如,如果我需要记住 XML 或 HttpClient 的特定语法,或者其他大量内容,我只需使用 search 功能,找到它,运行它,然后进行修改和玩耍,以适应我的场景。

其中一个示例文件夹甚至是如何使用 LINQPad 的教程。但是,即使这样还不够,还有 Nuget 包的作者会将示例嵌入他们的库中,所以如果你有允许使用 Nuget 的许可证(从开发者许可证开始),那么你实际上可以搜索 Nuget,其中包含示例的库会附带文本说明,告诉你哪些包提供示例,这样你就可以在甚至不必编写代码的情况下试用库了。

这是个奖励。当我编写查询或脚本时,我倾向于达到一个点,它大致上能做到我想要的事情,但我不想弄乱它,而且我还想进一步实验,所以你可以右键单击任何查询并克隆它,它会创建一个完全相同的独立实例,这样你就可以在最终决定保存之前以多种方式进行调整和玩耍。

输出

运行脚本时,你可以选择 2 种默认模式之一

  • 富文本
    • 在此模式下,所有内容都输出在一个框架内,该框架将输出包装在 HTML 中,因此你甚至可以自定义内容和显示方式。
    • 当处理具有外键关系的数据时,连接会以链接的形式突出显示,以便你可以探索数据。你无法想象这有多么有用,而不是不断编写 join 子句来查找你感兴趣的那个项目。
    • 它对输出量有限制
    • 可以通过不同的可视化工具进行自定义
    • 处理大量互联数据时运行速度稍慢
  • 数据网格
    • 比富文本快,因为它不格式化或加载那么多数据
    • 如果你的提供程序(例如 SQL 的默认提供程序)允许编辑和操作数据,那么你可以运行一个针对表的查询,然后手动编辑数据,就像在 SQL Server Manager 中“编辑行”一样。
    • 允许无限数据(如果你有足够的内存)
    • 每个关系链接都会打开一个新的数据网格,这样你就可以通过它们进行导航。

除了我们之前看到的查询结果输出外,还有一些额外的输出(这些也可以扩展,例如有一个查询执行计划的可视化工具)。这些输出包括:

  • Lambda 符号 (λ) – 这在编写复杂的 LINQ 时很有用,例如 from x in y where x > 2 select x, 这将显示你使用了哪些 LINQ 方法调用。
  • SQL – 这显示了当你针对 SQL 数据库运行查询时,实际运行了哪些 SQL 语句,并且在单击输出中的关系链接时,此面板会更新为数据库中运行的内容。另一个用途是编写 LINQ 语句,然后查看提供程序如何将其转换为 SQL,以防你像我一样,知道如何用 LINQ 编写某些内容,但用 SQL 编写却有点尴尬。
  • IL – 这是给那些想看他们的代码实际编译成什么的人。我必须承认我很少使用这个,但如果你需要做一些 IL 相关的工作,它是个不错的选择(提示:IL Weaving 在编译后更改 DLL 很有用)。
  • 树 – 这使用 Roslyn(.NET 编译器)显示了编写代码的语法树。同样,我没有机会从中受益很多,但作为可用性,我可以看到将代码粘贴到 LINQPad 中进行检查,然后也许基于 Roslyn 使用此语法树编写自定义分析器,例如在项目中强制执行团队规则。
  • 额外的非默认项 – 当你创建扩展或为 WPF 或 WinForms 创建 UI 组件(如按钮、列表和任何你可能正在处理的控件)时,这里会出现更多可视化工具。

最后一个输出功能是“导出”下拉菜单,其中包含一个按钮列表,允许你将结果导出以供其他方式使用,例如导出到 Excel(如果你想将某些结果嵌入到电子表格中)、Word 文档或 HTML。

API

好吧,我们已经详细讨论了这个应用程序本身的功能,但该应用程序也有自己的 API(可以通过插件进行扩展),这使得它变得更好。

Dump()

我遇到的最好的扩展方法之一是 .Dump() 扩展方法,我甚至在需要时自己编写了一些基本的方法,灵感来自 LINQPad 中的 Dump 方法。此扩展方法接收任何项,输出它,然后返回它,就好像什么都没发生一样,这里有一个例子:

Client
.Dump()
.Where(a=> a.PhoneNumber != null)
.Dump()
.Select(a=> a.UserName)
.Dump()
.OrderBy(a=> a)
.Dump()

利用这个简单的想法,即获取任何项并按原样返回,你可以将此方法调用插入到任何地方,并查看过程中发生了什么,这使得调试变得更加容易。对于这个例子,我将拥有所有客户的集合、有电话号码的客户、姓名集合以及排序后的集合。

请记住,我之前说过是“任何项”,这意味着你也可以在复杂对象和集合上调用它,以查看它们内部是什么、它们的属性、它们的 public 字段。

附注:在表达式模式下运行时,此扩展方法也会被默认调用。

另外,难怪此方法也有一个重载集,并且知道如何解释它接收的对象,这就是为什么我说我的实现是粗糙的,尽管它们在当时完成了需要的事情。

Util.GetPassword

Util 类下可以找到许多其他巧妙的功能,这是一组改变应用程序行为的函数,其中一个非常重要的是 GetPassword

这里有一个例子,比如你想做一个电子邮件客户端来排序你的邮件、搜索关键词等等(我曾经需要它 😀 ),但你不想将你的密码硬编码在可能有一天会共享或上传到公共网站的脚本中。因此,在 LINQPad 的“文件”菜单下,有一个叫做“密码管理器”的功能,所以你可以将敏感信息以键值对的形式存储起来,并在你的脚本中使用密码,而无需以明文形式保存它们。这些密码只保存在本地计算机上并经过加密,在脚本中访问它们的方式是调用 Util.GetPassword(“key”),其中将“key”替换为你用在管理器中的键。

其他 API 魔法

虽然我不会详细介绍 API,但教程已经做得很好,我已经提到了最重要的两个,不过要获得更全面的列表(除了教程),你还可以查看 StackOverflow 上的这篇文章

最后一个很棒的功能

当你下载 LINQPad 时,它会附带一个名为 LPRun 的附加应用程序。如果你想保持脚本的原样(.linq 格式),那么你可以使用这个可执行文件来运行这样的脚本,而无需打开 LINQPad。这对于需要在计时器等基础上运行的轻量级脚本非常有用,你只需要调用该可执行文件并传入要运行的脚本的完整路径。

实际例子

我想列举一些我在 LINQPad 中做过的事情,希望能激发你的一些新想法。这绝不是一个完整的列表,因为这个工具让勾画新的想法变得非常容易。

  • 一个倒计时器,计算到某个特定时间点(嘿,它帮助了我所需的事情)
  • 一个选择性清除我的 Firefox 浏览历史记录的脚本
  • 一个网页爬虫
  • 一个搜索文件中关键字的脚本,可以配置线程数和自定义逻辑(我们将在下一篇文章中很快看到一个例子)
  • 一个随机字符串生成器(当你没有样本数据中的字符串创意,或者需要生成密码时,可以配置长度和允许的字符)
  • 一个联系人列表,包含朋友的实时时区信息,这样我就永远不会在太晚或太早的时间打扰他们。
  • 一个根据我当时的确切需求和想要的速度同步两个目录的脚本。
  • 一个 WinForms 实现,可以绘制数据库中的数据,这样我就可以直接导出并粘贴到文档中。
  • 一个电子邮件解析器,用于跟踪电子邮件的自定义规则。
  • 一个用于加密/解密那些敏感文档和文件的脚本。
  • 一个计算我工作时间表的脚本(在我填写那些的时候 😀 )。
  • 一个货币兑换追踪器。

这些只是我曾有过的需求,但从不需要将其制作成完整的应用程序。优势在于 LINQPad 非常轻量级,打开速度快,而且如果我需要调整其中任何一个,我都可以做到,而无需重新编译、测试等等,并且可以获得非常快的反馈。

结论

我知道这篇帖子内容相当丰富,但这个工具非常通用,我个人在我的每一台工作机器上都安装了它,它让我的生活变得轻松很多,从测试这里发布的代码(除非是带有单元测试的解决方案等),到找出 19 天后是星期几(是的,我可能太懒了,不想拿出日历算一下),甚至引用遗留应用程序的程序集来测试我正在处理的功能,而无需进行 15 次点击才能确认设计。

如上所述,下一篇文章不依赖于 LINQPad(很少有东西是完全依赖的),但它确实提供了很多帮助。

希望你喜欢,下次再见。

© . All rights reserved.