2


0

私自身のSQL Server DBアクセスルーチンを何年にもわたって転がしてきただけで、つま先をLinq2sqlプロジェクトに浸してください。

linq2sqlを私のカスタムコードのように振る舞わせる方法を考え出す前に時間をかけ過ぎる前に、関係を設定することで使える「ビルトイン」振る舞いがすでに組み込まれていないことを確認したいと思います。デザイナー…​

非常に簡単な例:

私は2つのテーブルを持っています:Person.ID→ Note.PersonIDによってリンクされた1対多の関係(1人、多くのノート)を持つPersonとNotes。

私はストアドプロシージャを持っています(すべてのデータアクセスはSPを介して行われ、それを続けることを計画しています)。

  • sp_PersonGet(@ID int)は個人の記録を返し、 sp_PersonNotesGet(@PersonID)は*この個人の関連メモのセットを返します。

これまでのところ非常に良いことに、私は目的があります。

個人としての薄暗いmyPerson = db.PersonGet(pnID)。

myPerson.Name、myPerson.Phoneなどの自分のフィールドにアクセスできます。

 +
そして私もすることができます
メモとしてメモを暗くする= db.PersonNotesGet(pnID)

一連のメモを取得するには、次のようにこのリストを繰り返します。

myNotesでメモしたように各Nに対して(何かをする)

これはすべてうまくいきます…でも……。

myPerson = db.PersonGet(pnID)

また、myPerson.Notesコレクションも用意されています。

各NについてmyPerson.Notesのメモ(何かをする)

基本的に、Linq2SQlはPersonレコードが作成されるたびに2つのストアドプロシージャを呼び出す必要があります。

これは「すぐに使える」のか、それとも私が自分でコーディングする必要があるのか​​。

3 Answer


3


これは通常私たちが子コレクションと呼ぶものであり、それらは熱心にロードされるか遅延ロードされることができます。 これらを読む:


2


それは部分的なクラスを使います。 Personクラスに独自の「Notes」プロパティを追加して、それをGETter関数で初期化することができます。 これは、個人レコードをロードするたびにメモを取り込むよりも優れています。


0


試したことはありませんが、LINQではストアドプロシージャを使用しません。 あなたがする必要があるのはあなたのストアドプロシージャを使うためにランタイムを使うことからInsert / Delete / Updateメソッドを変更することです。 次に、PersonクラスにNotesのEntitySetを作成し、NotesクラスにPersonのEntityRefを作成する2つのエンティティテーブル間の関連付けを作成します。 自動的にロードするように、または遅延ロードを使用してこれを設定できます。

私が見ることができる限り、唯一のトリッキーなビットは、ランタイム生成メソッドの使用からストアドプロシージャの使用への変更です。 代わりに使用可能になる前に、それらをメソッドとしてデータコンテキストに追加する必要があると考えられます(デザイナーのサーバーエクスプローラからテーブルにドロップすることによって)。