2009-08-03 7 views
59

Sto usando LINQPad per creare query LINQ in un'applicazione che sto installando.In che modo LINQPad fa riferimento ad altre classi, ad es. Libri nei campioni LINQ in azione

Ho notato che nei campioni scaricati LINQ nell'azione, ad es. Esempio 4.04, intellisense mostra una classe "Libri", ma non vedo alcun riferimenti o "utilizzando" dichiarazioni nello strumento LINQPad, qui è il campione:

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(); 

In "LinqBooks.Common, business Objects, Book.linq "è dove la classe sembra essere definito:

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; 
    } 
} 

Ma come fa questo lavoro in modo che posso copiare nei miei corsi e utilizzare LINQPad di costruire rapidamente le dichiarazioni LINQ che posso quindi copiare nuovamente nella mia domanda?

risposta

99

Se si fa clic con il pulsante destro del mouse sull'editor di codice in LINQPad e si sceglie Proprietà avanzate di query, sono disponibili due finestre di dialogo: Riferimenti aggiuntivi e Importazioni spazio dei nomi aggiuntive.

1) In Ulteriori riferimenti, scegliere Aggiungi quindi fare clic su Sfoglia e spostarsi l'assembly personalizzato.

2) Poi, in Namespace addizionali importazioni, digitare i namespace si desidera importare da quella assemblea.

+0

era il pulsante "Sfoglia" che mi mancava, grazie! –

10

LINQPad consente di fare riferimento assembly personalizzati attraverso i avanzate Proprietà query finestra che può essere aperto premendo F4.

+0

Così ho creato una DLL con le mie classi in cui voglio interrogare. Premo F4 e ** Aggiungi ** ma non lo vedo nell'elenco. Come faccio a fare riferimento al mio dll personalizzato? –

+0

Nella stessa finestra di dialogo è necessario utilizzare _Importazioni spazio dei nomi aggiuntivi_ per portare tali spazi dei nomi in ambito. –

+0

Ma tutto quello che ho è una .dll che voglio accedere in LINQPad, ad es. "C: \ temp \ SmartFormTest.dll", copio quella riga in * Additional Namespace Imports "ma non riesco a farvi riferimento né compare nell'elenco Aggiungi. Come posso fare riferimento a ** C: \ temp \ SmartFormTest .dll **? –

4

In realtà, se si guarda il file LINQ come Book.linq con il blocco note, si vedrà il file è una miscela di XML e un frammento di codice alla fine:

<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=..."; 
.... 

Nelle parole di ordine , puoi trovare maggiori informazioni sui dettagli dai file linq di esempio su come LINQPad ottiene tutte le informazioni, costruisce un assembly dinamico e lo esegue internamente per ottenere i risultati sulla sua interfaccia utente.

A proposito, ieri sera ho scritto un blog su questo strumento e sulla mia struttura: LINQPad a .Net Snippet Code IDE.

+0

L'esempio dei codici xml e snip, il mio post sopra, non proviene da Book.linq. Ecco un esempio generico della struttura di xml e codici. –

2

Edward, abbiamo utilizzato una serie di strategie per la creazione dei campioni LINQ in Action. Nei capitoli del database, spesso ci siamo basati solo sulla capacità di LINQPad di generare automaticamente le classi in base alle tabelle del database.

Nel caso in cui si fa riferimento qui (4.04) abbiamo aggiunto il riferimento alla libreria di classi precompilata utilizzando F4. Abbiamo utilizzato questa strategia nei casi in cui LinqPad ha generato classi diverse da quelle generate da Visual Studio e ha quindi determinato un comportamento diverso del contesto, in particolare per quanto riguarda il rilevamento delle modifiche.

In altri casi, abbiamo aggiunto una classe nidificata in linea con il resto dell'esempio e utilizzato l'opzione "Programma" nell'editor di codice. Vedi esempio 6.02.In questo caso, stiamo incorporando la classe Books all'interno della classe DataContext generata generata da LinqPad. Abbiamo anche usato questa strategia quando volevamo fare il pseudonimo dei nostri nomi di colonne perché le classi generate automaticamente create da LinqPad non ci permettono facilmente di creare alias di quelle colonne all'interno dello strumento.

In un paio di esempi, in particolare dove stiamo dimostrando i metodi di estensione personalizzati, abbiamo dovuto fare un altro trucco per forzare la classe di contesto generata alla fine (aggiungendo un finale ineguagliato ineguagliato} o End Class) e quindi iniziare una nuova classe, ma omettendo è la chiusura end brace/end class. Puoi vederlo nell'esempio 2.16 negli esempi scaricati.