Как LINQPad ссылается на другие классы, например книги в образцах LINQ in Action

Я использую LINQPad для создания запросов LINQ в приложении, которое я расширяю.

Я заметил, что в скачанном LINQ в действии примеры, например пример 4.04, intellisense показывает класс "книги", но я не вижу никаких ссылки или "используя" операторы в инструменте LINQPad, вот пример:

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.Общие, Бизнес-Объекты,книги.в 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, которые я могу скопировать обратно в свое приложение?

4 ответов


если щелкнуть правой кнопкой мыши в редакторе кода в LINQPad и выбрать Дополнительные свойства запроса, появится два диалоговых окна: Дополнительные ссылки и дополнительный импорт пространства имен.

1) в Дополнительная Литература выберите добавить нажмите кнопку обзор и перейдите к пользовательской сборки.

2) затем, в Дополнительный Импорт Пространства Имен введите пространства имен вы хотите импортировать из этой сборки.


LINQPad позволяет ссылаться на пользовательские сборки через Дополнительные Параметры Запроса диалог, который можно открыть, нажав Ф4.


на самом деле, если вы посмотрите на файл linq, такой как Book.linq с блокнотом вы увидите, что файл представляет собой смесь XML и фрагмента кодов в конце:

<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 получает всю информацию, создает динамическую сборку и запускает ее внутри, чтобы получить результаты обратно в свой пользовательский интерфейс.

кстати, вчера вечером я написал блог об этом инструменте и моем понимании его структура:LINQPad .NET фрагмент кода IDE.


Эдвард, мы использовали ряд стратегий при построении LINQ в образцах действия. В главах базы данных мы часто просто полагались на способность LINQPad автогенерировать классы на основе таблиц базы данных.

в случае, если вы ссылаетесь здесь (4.04), мы добавили ссылку на предварительно скомпилированную библиотеку классов с помощью F4. Мы использовали эту стратегию в случаях, когда LinqPad создавал классы, отличные от классов, созданных Visual Studio, и таким образом вызывал поведение контекста иначе, чем вы ожидаете, особенно в отношении отслеживания изменений.

в других случаях мы добавили вложенный класс, встроенный в остальную часть образца, и использовали опцию "программа" в редакторе кода. См. пример 6.02. В этом случае мы фактически внедряем класс Books внутри сгенерированного класса DataContext, который генерирует LinqPad. Мы также использовали эту стратегию, когда хотели псевдонимы наших имен столбцов, потому что автоматически создаваемые классы, которые создает LinqPad, нелегко давайте псевдоним этих столбцов внутри инструмента.

в нескольких примерах, особенно там, где мы демонстрируем пользовательские методы расширения, нам пришлось сделать еще один трюк, заставив сгенерированный класс контекста закончить (добавив явно непревзойденный конец } или класс End), а затем начать новый класс, но опуская его закрывающую конечную скобку/класс end. Вы можете увидеть это в Примере 2.16 в загруженных образцах.