2009-05-12 15 views
18

私はちょうどLINQPadの使用を開始しましたが、これまでのところ好きですが、ほとんどのチュートリアルはLINQ TO SQLのためにVisual Studioで生成されたDataContextクラスを使用して更新を永続化しました。 SQLへの私の質問は、(1がある場合)LINQPadに、次の...DataContextクラスに相当するLINQPadはありますか?

MyDbDataContext db = new MyDbDataContext(); 

... 

db.SubmitChanges(); 
+1

コードを中に生成されたクラスが選択されたデータベースの生成のDataContextの一部です。 LINQPadコードのコンテキストを参照する必要がある場合は、「this」を使用します。注意:LINQPadは、LINQ to SQLとまったく同じコンテキストを生成しないため、LINQPadでLINQ to Sqlと同じように動作しないエッジケースもあります。 –

答えて

30

短い答えの同等とは何かあるので:あなたはDataContextのを自分で作成する必要はありません。 LINQPadには多数のサンプルが付属しています。

LINQPadをデータベースに接続すると、DataContextが作成されます。 DataContextのテーブル(Table<T>)とSubmitChanges()は、ローカルメンバーとして利用できます。 LINQPadの "C#ステートメント" モードでは

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

:たとえば

、あなただけ書くことができますLINQPadのデフォルトの "C#の式" モード

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のDump()拡張メソッドをすることができ非常に便利です任意のオブジェクトまたはコレクション(LINQPadのステートメントモード)を呼び出して、以下の結果を表示します。

LINQPadを使用するためにデータベースに接続する必要はありません。あなたは、メモリ内のコレクションを操作できます。

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

実際には、あなたもLINQPadを使用するためにLINQを使用する必要はありません。また、スニペットコンパイラとしても機能します。

+2

LINQ to SQLとLINQPadで新しいレコードを挿入するとどうなりますか?私はIDOを持つデータベース内のテーブルにInsertOnSubmit()を呼び出して挿入しようとしましたが、「そのカラムは変更できません」という例外がありました。 IDは決して指定されなかった。 – jlafay

+0

@jlafayおそらく長らく解決されていますが、TEntityにプライマリキーが設定されていない可能性があります。 –

14

私はこれが既に答えを持っていることを知っています。私はLucasと同意しますが、この質問の読者に役立ついくつかの事柄を追加したいと考えていました。

必要に応じて、アセンブリから独自のDataContextを読み込むことができます。 独自のコンテキストをロードするか、LinqPadをビルドするかにかかわらず、LinqPadによって生成された「UserQuery」クラスのコンテキストで実行されています。

次のC#なステートメントはこれを示しています

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

このUserQueryクラスはDataContextの由来します。この例では、私はLinqpadは、AdventureWorksデータベースのためのDataContext作成してみましょう:私は自分のDataContextをロードする場合

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

をMyDataContextと呼ばれる:

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

をそれは前に述べたように、あなたがする必要はありません。 LINQPadがデフォルトで作成するようにDataContextを作成します。
しかし、念のために、あなたはこれがちょうど自動的に作成したような第二のDataContextを作成します

var secondDataContext = new UserQuery(); 

を使用することができます(同じデータベース用)第二のDataContextを必要としています。

+0

ありがとう!これは、Visual Studioからlinqpadへのクエリをコピーして貼り付けるために必要なことです。そうしないと、DBコンテキストを削除する必要があります。 –

5

jaraicsからの返信に基づいて、UserQueryコンストラクターに接続文字列が必要であることがわかりました。少なくともLINQPadバージョン4.37.11ではそうです。したがって、LINQPadによって作成されたUserQueryインスタンスから接続文字列を取得し、それを使用して自分のインスタンスを作成しました。

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

私は上記のコードを使用して、私に2番目のDataContextを与えました。

+7

FWIWでは、ctorがIDbConnectionのパラメータを代わりに使用するようになったので、これはもう機能しません(少なくとも4.42.01)。これで、var secondDataContext = new UserQuery(this.Connection); –

0

私は主要部の外側に静的メソッドを追加するたびにサンプルを下記でアクセスすることができる:

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