2009-05-12 6 views
18

Ich habe gerade mit LINQPad begonnen und bisher gefällt es mir, aber die meisten Tutorials, die ich für LINQ TO SQL gefunden habe, verwenden eine DataContext-Klasse, die von Visual Studio für persistente Updates usw. generiert wird. Ich bin auch ziemlich neu in LINQ TO SQL so meine Frage ist, was ist das Äquivalent der folgenden in LINQPad (falls vorhanden) ...Gibt es ein LINQPad, das einer DataContext-Klasse entspricht?

MyDbDataContext db = new MyDbDataContext(); 

... 

db.SubmitChanges(); 
+1

Die Klasse, die Ihr Code generiert wird in einem Teil des erzeugten Datacontext für die ausgewählte Datenbank ist. Wenn Sie auf den Kontext Ihres LINQPad-Codes verweisen müssen, verwenden Sie "this". Hinweis: LINQPad generiert den Kontext nicht genau wie LINQ to SQL. Daher funktionieren einige Edge-Fälle in LINQPad möglicherweise nicht genauso wie in LINQ to SQL. –

Antwort

30

Kurze Antwort: Sie brauchen nicht auf die Datacontext selbst zu erstellen. LINQPad kommt mit vielen Proben, werfen Sie einen Blick auf sie.

Wenn Sie LINQPad mit einer Datenbank verbinden, wird der DataContext für Sie erstellt. Die DataContext-Tabellen (Table<T>) und SubmitChanges() sind als lokale Mitglieder verfügbar.

Zum Beispiel LINQPad der default "C# Ausdruck" -Modus können Sie einfach schreiben:

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

In LINQPad der "C# Statement" Modus:

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 

LINQPad des Dump() Extension-Methode ist sehr nützlich sein kann Jedes Objekt oder jede Sammlung (im LINQPad-Anweisungsmodus) aufgerufen, um die folgenden Ergebnisse anzuzeigen.

Beachten Sie, dass Sie nicht einmal eine Verbindung zu einer Datenbank herstellen müssen, um LINQPad zu verwenden. Sie können mit In-Memory-Sammlungen arbeiten:

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

In der Tat, Sie nicht einmal LINQ verwenden müssen LINQPad zu verwenden. Es funktioniert auch gut als Snippet-Compiler.

+2

Was ist mit dem Einfügen neuer Datensätze mit LINQ to SQL und LINQPad? Ich versuchte, einzufügen, indem ich InsertOnSubmit() auf einer Tabelle in meiner Datenbank mit einer Identitätsspalte aufruft, und ich bekam eine Ausnahme "Die Spalte kann nicht geändert werden". Die ID wurde nie angegeben. – jlafay

+0

@jlafay wahrscheinlich schon lange gelöst, aber vielleicht hat deine TEntity keinen Primärschlüssel gesetzt. –

14

Ich weiß, das hat bereits eine Antwort und ich stimme Lucas zu, wollte aber ein paar Dinge hinzufügen, die den Lesern dieser Frage helfen könnten.

Sie können Ihren eigenen DataContext von der Baugruppe laden, wenn Sie möchten. Unabhängig davon, ob Sie Ihren eigenen Kontext laden oder LinqPad einen für Sie erstellen lassen, werden Sie im Kontext einer "UserQuery" -Klasse ausgeführt, die von LinqPad generiert wird.

Der folgende C# statment zeigt dies:

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

Diese Userquery-Klasse aus einer Datacontext ableitet. Im diesem Beispiel lasse ich LINQPad eine Datacontext für die Datenbank Adventureworks bauen:

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

Wenn ich meine eigene Datacontext genannt MyDataContext laden:

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

Wie es bereits erwähnt wurde, brauchen Sie nicht zu Erstellen Sie einen DataContext, da LINQPad standardmäßig einen erstellt.
Aber nur für den Fall, müssen Sie eine zweite Datacontext (für die gleiche Datenbank) Sie ein Dieses

var secondDataContext = new UserQuery(); 

schaffen wird eine zweite Datacontext ebenso wie die automatisch erstellt nutzen könnten.

+0

Danke! Das ist, was benötigt wird, um Abfragen von Visual Studio auf linqpad zu kopieren und einzufügen, nur mit dieser kleinen Änderung, ansonsten muss der db-Kontext entfernt werden! –

5

Aufbauend auf der Antwort von Jaraics, fand ich, dass der UserQuery-Konstruktor eine Verbindungszeichenfolge benötigt.Zumindest für LINQPad Version 4.37.11. Daher habe ich die Verbindungszeichenfolge aus der von LINQPad erstellten UserQuery-Instanz abgerufen und verwendet, um eine eigene Instanz zu erstellen.

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

Wenn ich den obigen Code verwendete, gab es mir einen zweiten DataContext.

+7

FWIW, das funktioniert nicht mehr (zumindest mit 4.42.01) da der ctor jetzt einen param von IDbConnection nimmt, also kannst du einfach var secondDataContext = new UserQuery (this.Connection); –

0

Ich kann mit folgendem Beispiel zuzugreifen, wann immer ich eine statische Methode außerhalb des Hauptteils hinzu:

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