Как LINQPad ссылается на другие классы, например Книги в примерах LINQ in Action - PullRequest
64 голосов
/ 03 августа 2009

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

Ответы [ 4 ]

105 голосов
/ 03 августа 2009

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

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

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

10 голосов
/ 03 августа 2009

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

4 голосов
/ 18 сентября 2009

На самом деле, если вы посмотрите на файл 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. IDE .Net Snippet Code IDE .

2 голосов
/ 13 июня 2011

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

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

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

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

...