2009-05-12 15 views
18

Ho appena iniziato a utilizzare LINQPad e finora mi piace, ma la maggior parte delle esercitazioni che ho trovato per LINQ TO SQL fanno uso di una classe DataContext che viene generata da Visual Studio per gli aggiornamenti persistenti ecc. Sono anche abbastanza nuovo per LINQ a SQL quindi la mia domanda è che cosa è l'equivalente delle seguenti operazioni nella LINQPad (se ce n'è uno) ...Esiste un equivalente LINQPad a una classe DataContext?

MyDbDataContext db = new MyDbDataContext(); 

... 

db.SubmitChanges(); 
+1

La classe che il codice viene generato in fa parte del DataContext generato per il database selezionato. Se è necessario fare riferimento al contesto del codice LINQPad, utilizzare "questo". Nota: LINQPad non genera il contesto esattamente come fa LINQ su SQL, quindi alcuni casi limite potrebbero non funzionare nello stesso modo in LINQPad come con LINQ a Sql. –

risposta

30

risposta breve: non è necessario creare il DataContext da soli. LINQPad viene fornito con un sacco di campioni, dare un'occhiata a loro.

Quando colleghi LINQPad a un database, crea il DataContext per te. Le tabelle di DataContext (Table<T>) e SubmitChanges() sono disponibili come membri locali.

Per esempio, di LINQPad modalità predefinita "C# Expression" è possibile solo scrivere:

from p in Person 
where p.Name == "Joe" 
select p.Address 

In modalità di LINQPad "C# Dichiarazione":

var query = from p in Person 
      where p.Name == "Joe" 
      select p.Address; 

query.Dump(); // Dump() shows results below 

Person joe = query.First(); 
joe.Name = "Peter"; 
SubmitChanges(); 

joe.Dump(); // shows joe's values under the previous query results 

metodo di estensione Dump() di LINQPad è molto utile può essere chiamato su qualsiasi oggetto o collezione (nella modalità di istruzione di LINQPad) per mostrare i risultati di seguito.

Nota che non è nemmeno necessario connettersi a un database per utilizzare LINQPad. È possibile lavorare con le collezioni in memoria:

int[] numbers = new[] { 1, 2, 3, 4, 5 }; 
numbers.Where(n => n > 3).Select(n => n * 2).Dump(); 

In realtà, non è nemmeno bisogno di usare LINQ to utilizzare LINQPad. Funziona anche alla grande come un compilatore di frammenti.

+2

Che ne dici di inserire nuovi record con LINQ su SQL e LINQPad? Ho provato a inserire invocando InsertOnSubmit() su una tabella nel mio database con una colonna Identity e ho ottenuto un'eccezione "La colonna non può essere modificata". L'ID non è mai stato specificato. – jlafay

+0

@jlafay probabilmente è da tempo risolto, ma forse il tuo TEntity non aveva una chiave primaria impostata. –

14

So che questo ha già una risposta e sono d'accordo con Lucas ma volevo aggiungere un paio di cose che potrebbero aiutare i lettori di questa domanda.

Se lo si desidera, è possibile caricare il proprio DataContext dall'assieme. Indipendentemente dal fatto che si carichi il proprio contesto o che LinqPad ne crei uno per te, si sta eseguendo nel contesto di una classe "UserQuery" generata da LinqPad.

Il seguente C# statment mostra questo:

classe
this.GetType().Name.Dump(); // Shows UserQuery 

Questo UserQuery deriva da un DataContext. In questo esempio ho lasciato LINQPad costruire un DataContext per il database AdventureWorks:

this.GetType().BaseType.Dump(); // Shows TypedDataContext 

Se carico il mio DataContext chiamato MyDataContext:

this.GetType().BaseType.Dump(); // Shows MyDataContext 
12

Come è stato detto prima, non è necessario creare un DataContext come LINQPad ne crea uno per impostazione predefinita.
Ma solo nel caso, è necessario un secondo DataContext (per lo stesso database) è possibile utilizzare

var secondDataContext = new UserQuery(); 

Questo creerà una seconda DataContext, proprio come l'automaticamente creato uno.

+0

Grazie! Questo è ciò che è necessario per copiare e incollare le query da Visual Studio a Linqpad con solo questa piccola modifica altrimenti è necessario rimuovere il contesto db! –

5

Sulla base della risposta di jaraics, ho trovato che il costruttore di UserQuery richiede una stringa di connessione.Almeno lo fa per LINQPad versione 4.37.11. Pertanto, ho recuperato la stringa di connessione dall'istanza UserQuery creata da LINQPad e l'ho utilizzata per creare la mia istanza.

var connectionString = this.Connection.ConnectionString; 
var secondDataContext = new UserQuery(connectionString); 

Quando ho usato il codice di cui sopra, mi ha dato una seconda DataContext.

+7

FWIW, questo non funziona più (almeno con 4.42.01) poiché il ctor ora accetta un parametro di IDbConnection, quindi ora puoi semplicemente fare var secondDataContext = new UserQuery (this.Connection); –

0

posso accedere con seguente esempio ogni volta aggiungo un metodo statico al di fuori della parte principale:

using(var VT = new LINQPad.User.TypedDataContext()) 
    return (from g in VT.GM_MEMBERS where g.Username == username select new { g.Password }).FirstOrDefault()?.Password; 
Problemi correlati