2010年11月28日

LINQ to SQL 番外編 - IDENTITY列の扱い

   このエントリーをはてなブックマークに追加 Clip to Evernote
IDENTITY列の扱い テーブルに行を挿入した際に、自動で番号を振りたい場合に、列にIDENTITYを指定すると便利ですが、
挿入直後にこの値を取得したい場合に、LINQ to SQLはとても便利な機能を備えています。

主キーにIDENTITYを指定したカラムについて、O/Rデザイナーが作成する「LINQ to SQLエンティティクラス」の
プロパティがどうなっているのかを見てみましょう。

NortwindデータベースのCategoryテーブルのCategoryIDカラムがこれに該当します。
Northwind.designer.csを開いて、CategoryクラスのCategoryIDプロパティを見て ください。
以下のような記述があるのを確認できると思います。
注目すべきは、
の部分です。この指定があると、行が挿入されると自動で、CategoryIDカラムを 取得する select文が発行されます。

そのため、
というコードを実行すれば、SubmitChanges()後の、c1.CategoryIDには、データ ベースで
生成された値を参照することができます。

わずらわしいコーディングから解放されるのは、とても嬉しいですね。
ただ、2つのSQL文がリクエストされるのは避けたいという場合には、 ストアドプロシージャを利用することも検討してください。
  

Posted by gushwell at 22:30Comments(0)TrackBack(0)

2010年11月25日

LINQ to SQL 番外編 - データベースの作成

   このエントリーをはてなブックマークに追加 Clip to Evernote
DataContext の CreateDatabase() メソッドを呼び出すことで、データベースの
新しいインスタンスを作成することが可能です。
「LINQ to SQLエンティティクラス」には、データベースのテーブルやカラムに関する
属性があるので、この情報を利用して、データベースのインスタンスを作成します。


「LINQ to SQLエンティティクラス」の定義

ここでは、方法 : データベースを動的に作成する (LINQ to SQL)に記載されている「LINQ to SQLエンティティクラス」を拡張し、
リレーショナル構造をもった「LINQ to SQLエンティティクラス」を定義してみました。

上記記事の例との意違いは、
・Categoriesテーブルを追加
・DVDテーブルに、CategoryIDカラムを追加
・DVDテーブルと、Categoriesテーブルを関連づけ
です。

DataContextの定義

DataContextを継承し、カスタムのDataContextクラスを定義します。DataContext派生クラスには、
作成する上記テーブルをメンバーとして宣言します。

データベースを作成するコード

以下、データベースを作成するコードです。
この例では、DatabaseExists()で、データベースの存在を確認し、存在していた場合は、
DeleteDatabase()で、データベースを削除後、CreateDatabase()でデータベースを
作成するようにしています。

  
Posted by gushwell at 23:12Comments(0)TrackBack(0)

2010年11月23日

コンソールで処理中であることを示す文字を表示

   このエントリーをはてなブックマークに追加 Clip to Evernote
元ネタ いろいろ備忘録日記 - コンソールで処理中であることを示す文字を表示

おもしろそうだったので、僕もやってみました。

指定した複数の値を繰り返す」で示したRepeat拡張メソッドを使って、gsf_zero1 さんが書いたコードを書き換えています。

以下に示すコードのProgressメソッドが、処理中であることを示すメソッドです。
gsf_zero1 さんは、ラムダ式としていましたが、これをメソッドにしています。

このメソッドの中で、Repeatメソッドを使い、コンソールに表示する文字を繰り返し取得しています。
僕のコードでは、'.' 'o' 'O' '@' 'O' 'o' という6文字を繰り返して取り出し、コンソールに表示しています。
別の文字を表示したいなら、文字列 ".oO@Oo" の部分を"|/-" など別のものに置き換えるだけです。


  
Posted by gushwell at 23:10Comments(0)TrackBack(0)

2010年11月21日

LINQ to SQL 番外編 - 読み込み専用でデータベースを利用する

   このエントリーをはてなブックマークに追加 Clip to Evernote
DataContextは、エンティティオブジェクトの変更を追跡していますが、データベースから
データを読み込むだけで、更新を行う必要がないシナリオが多く存在します。
そのようなときには、DataContextに、エンティティへの変更を追跡しないように指示することで、
パフォーマンスを向上させることができます。
その指示は、ObjectTrackingEnabledプロパティを使います。
これだけです。

※ 変数 db は、DataContext型のオブジェクトを表します。

もちろん、この状態で、SubmitChanges()することは出来ません。呼び出した時点で例外が発生します。
  
Posted by gushwell at 22:30Comments(0)TrackBack(0)

2010年11月18日

LINQ to SQL 番外編 - DataContext.OnCreateって何?

   このエントリーをはてなブックマークに追加 Clip to Evernote
NorthwindDataContextのコンストラクタでは、OnCreateというメソッドを呼び出しています。

これってなんでしょうか?
Northwind.designer.csのNorthwindDataContextクラスの定義を見てみると、

とパーシャルメソッドとなっています。

つまり、NorthwindDataContextのパーシャルクラスに、OnCreated()メソッドを定義すれば、
このメソッドが、NorthwindDataContextインスタンス生成時に呼び出されるということです。

試しに、OnCreatedメソッドを実装してみましょう。

プロジェクトに、クラスの追加で、NorthwindDataContext.csというファイルを新規作成し、
そこに、以下のように記述します。
これで、再度ビルドし実行すれば、
が実行された時点で、

 NorthwindDataContext Created

とコンソールに出力されることがわかると思います。
この機能を使うことで、ログ出力などのカスタムコードを挿入することが可能になります。

その他のパーシャルメソッドについても、カスタムコードを挿入する際に利用できるものだと
思いますが、調べきれていません。
もし、気が向いたら調べたいと思います。
  
Posted by gushwell at 23:00Comments(0)TrackBack(0)

2010年11月16日

LINQ to SQL 番外編 - 接続文字列

   このエントリーをはてなブックマークに追加 Clip to Evernote
DataContext は、データベースからオブジェクトを取得したり、変更を再送信したりする際に使用するクラスで、LINQ to SQLの最も中心となるクラスです。

Visual Studio のO/Rデザイナー画面で、「LINQ to SQLエンティティクラス」を作成すると、必ず、DataContextから派生したカスタムクラスのコードが作成されます。
DBにアクセスするには、次のように、派生したDataContextクラスのインスタンスを生成し、データベースにアクセスする準備をします。


Northwind.designer.csのソースコードの中の、NorthwindDataContextクラスを見てみると、そのコンストラクタに、


※都合により途中で改行しています。

と書いてあります。
ADO.NET2.0と同様に、Settings.settingsに設定した接続文字列を使い、データベースに接続しているのが分かります。
通常は、App.Configの connectionStringsで指定した接続文字列が使われますが、
このApp.Configが無い場合には、ソースに埋め込まれた接続文字列が使われます。
なんかややこしい作りです。
第2引数のmappingSourceについては、僕自身まだ使ったことがなく、よく分かっていませんm(_ _)m

なお、

と、デフォルトの接続文字列以外を利用することもできます。
これは、ADO.NET2.0より、使いやすくなっていますね。
  
Posted by gushwell at 21:08Comments(0)TrackBack(0)

2010年11月14日

LINQ to SQL 番外編 - DataContextのスコープ

   このエントリーをはてなブックマークに追加 Clip to Evernote
DataContextのインスタンス生成にはそれほどコストはかかりませんので、
論理的な処理単位に対して生成、破棄をすることになります。
通常は、メソッドのスコープで生成、破棄することが多いかと思います。

この一連の記事(メルマガとこの番外編の記事)では、
以下のようにその都度NorthwindDataContextを生成するようになっています。
これは、コードをコピー&ペーストした際に、そのまま動くよう配慮したということもありますが、
実際のコードにおいても、小さな処理単位で、DataContext を使うことが多いと予想されるから
という意味もあります。
  
Posted by gushwell at 21:24Comments(0)TrackBack(0)

2010年11月08日

LINQ to SQL 番外編 - コンパイル済みクエリ

   このエントリーをはてなブックマークに追加 Clip to Evernote
パラメータだけが異なる同じクエリを何回も実行することはよくありますが、その ような場合、
クエリをコンパイルしてから、そのクエリを実行することでパフォー マンスを向上させることができます。

まず、以下のような、CompiledQuery.Compileを使い、デリゲート型のフィールド を定義します。
Compile メソッドは、入力パラメータを変更するだけで、
その後、何度も実行で きるキャッシュ可能なデリゲート型を返します。

この例では、nameがクエリのパラメータになります。
ProductByNameにはコンパイル済みクエリが格納されます。このコンパイル済みク エリを使うには、

のように書きます。
ここでは、パラメータは、nameひとつだけでしたが、もちろん、複数のパラメータ を渡すこともできます。

以下のようにラムダ式と var を使って書くこともできます。
デリゲートをいちいち定義するのも面倒なので、この書き方が良いかなと思ったり しましたが、
実際には、このコンパイル済みクエリは、何度も再利用することで効 果が得られますので、
上のようにローカル変数にして使うことは、あまり無いかなと思 います。
  
Posted by gushwell at 22:25Comments(0)TrackBack(0)