【问题标题】:How does LINQPad reference other classes, e.g. Books in the LINQ in Action samplesLINQPad 如何引用其他类,例如LINQ in Action 示例中的书籍
【发布时间】:2009-08-03 12:15:19
【问题描述】:

我正在使用 LINQPad 在我正在构建的应用程序中创建 LINQ 查询。

我注意到在下载的 LINQ in Action 示例中,例如示例 4.04,intellisense 显示类“书籍”,但我在 LINQPad 工具中没有看到任何 references 或“using”语句,示例如下:

List<Book> books = new List<Book>() {
  new Book { Title="LINQ in Action" },
  new Book { Title="LINQ for Fun" },
  new Book { Title="Extreme LINQ" } };

var titles =
  books
    .Where(book => book.Title.Contains("Action"))
    .Select(book => book.Title);

titles.Dump();

在“LinqBooks.Common, Business Objects, Book.linq”中似乎定义了类:

public class Book
{
  public IEnumerable<Author> Authors {get; set;}
  public String Isbn {get; set;}
  public String Notes {get; set;}
  public Int32 PageCount {get; set;}
  public Decimal Price {get; set;}
  public DateTime PublicationDate {get; set;}
  public Publisher Publisher {get; set;}
  public IEnumerable<Review> Reviews {get; set;}
  public Subject Subject {get; set;}
  public String Summary {get; set;}
  public String Title {get; set;}
  public String Test {get; set;}

  public override String ToString()
  {
    return Title;
  }
}

但这是如何工作的,以便我可以在我的类中复制并使用 LINQPad 快速构建 LINQ 语句,然后我可以将其复制回我的应用程序中?

【问题讨论】:

    标签: c# linq linq-to-objects linqpad


    【解决方案1】:

    如果您在 LINQPad 中的代码编辑器中单击鼠标右键并选择“高级查询属性”,则会出现两个对话框:附加引用和附加命名空间导入。

    1) 在Additional References中,选择Add,然后点击Browse并导航到您的自定义程序集。

    2) 然后,在 Additional Namespace Imports 中,键入要从该程序集导入的 namespaces

    【讨论】:

      【解决方案2】:

      LINQPad 允许您通过 高级查询属性 对话框引用自定义程序集,该对话框可以通过按 F4 打开。

      【讨论】:

      • 所以我创建了一个 .dll,其中包含我想要查询的类。我按 F4 和 Add 但我没有在列表中看到它。如何引用我的自定义 .dll?
      • 在同一个对话框中,您需要使用 Additional Namespace Imports 将这些命名空间纳入范围。
      • 但我只有一个 .dll,我想在 LINQPad 中访问它,例如“C:\temp\SmartFormTest.dll”,我在 *Additional Namespace Imports 中复制了该行,但我无法引用它,也没有出现在添加列表中。如何引用 C:\temp\ SmartFormTest.dll?
      【解决方案3】:

      实际上,如果你用记事本查看 linq 文件,例如 Book.linq,你会看到该文件是 XML 和末尾的 sn-p 代码的混合:

      <Query Kind="Statements"> <!-- kind: Program, ... --->
        <Connection>...</Connection> <!-- Optional, if you have connection to db -->
        <Reference>[path]\[library]</Reference> <!-- references to your customized libraries -->
        <Reference>RuntimeDirectory&gt;System.Data.dll</Reference> <!-- example to System.Data.dll -->
        <Namespace>System.Data</Namespace> <!-- here are nodes for namespaces... -->
        <Namespace>MyLibrary.Common</Namespace>
      </Query>
      
      var conn = "Data Source=...";
      ....
      

      换句话说,您可以从示例 linq 文件中找到有关 LINQPad 如何获取所有信息、构建动态程序集并在内部运行它以将结果返回到其 UI 的更多详细信息。

      顺便说一句,我昨晚写了一篇关于这个工具的博客以及我对它的结构的理解:LINQPad a .Net Snippet Code IDE

      【讨论】:

      • xml和snip代码的例子,我上面的帖子,不是来自Book.linq。这里只是一个通用的xml结构和代码示例。
      【解决方案4】:

      Edward,我们在构建 LINQ in Action 示例时使用了多种策略。在数据库章节中,我们经常只是依赖 LINQPad 的能力来根据数据库表自动生成类。

      如果您在此处引用 (4.04),我们确实使用 F4 添加了对预编译类库的引用。我们在 LinqPad 生成的类与 Visual Studio 生成的类不同的情况下使用此策略,从而导致上下文的行为与您的预期不同,尤其是在更改跟踪方面。

      在其他情况下,我们在示例的其余部分中添加了一个嵌套类,并在代码编辑器中使用了“程序”选项。参见示例 6.02。在这种情况下,我们实际上将 Books 类嵌入到 LinqPad 生成的 DataContext 类中。当我们想要为列名起别名时,我们也使用了这种策略,因为 LinqPad 创建的自动生成的类不容易让我们在工具中为这些列起别名。

      在几个示例中,特别是在我们演示自定义扩展方法的地方,我们不得不做另一个技巧,强制生成的上下文类完成(添加一个明显不匹配的结尾 } 或 End Class),然后开始一个新类,但是省略它的结束大括号/结束类。您可以在下载的示例中的示例 2.16 中看到这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-18
        • 2016-02-19
        • 1970-01-01
        • 2021-04-30
        • 1970-01-01
        相关资源
        最近更新 更多