ホーム > プログラミング, メモ, Oracle > LINQ PadでOracleのテーブルに対してクエリーを発行する。

LINQ PadでOracleのテーブルに対してクエリーを発行する。


LINQ Padは言わずと知れたLINQ実行環境です。

こいつを使えば、LINQ to ObjectsやLINQ to XML、LINQ to SQL、LINQ to Entitiesなんかに対するクエリーをさらっと記述してさらっと動作確認することができます。クエリの結果もわかりやすく構造化されて表示されるのでちょっと確認するにはぜひ手元においておきたいツールです。

今回はOracleに対してLINQ PadからLINQクエリーを発行するにはどうしたらいいんだろう?って話です。

IQ(IQ Toolkit)のインストール

LINQ PadでSQL Server以外のRDBMSにクエリーを発行する場合は、CodePlexで公開されているIQToolkitを利用します。LINQ Padからインストールする場合は、Choose a Driverウインドウからダウンロードしてインストールすることができます。

imageimage

ここでは他にも下記のドラーバーをインストールすることができます。

  • IQ Driver – for MySQL、SQLite、Oracle
  • Microsoft Streamlnsight Driver
  • Azure Table Strage Driver
  • Mindscape LightSpeed Driver
  • LLBLGen Pro Drivers
  • DevExpress eXpress Persistent Objects Driver
  • DevForce LINQPad Driver
  • NoSQL FileDb Driver

    Oracleへの接続

    新しいデータソースを追加するには、LINQ PadのAdd connectionリンクからChoose Data Contextウインドウを表示し、先程インストールしたIQ(Supports Oracle, MySQL, SQLite)を選択します。

image

続けてRDBMSの接続方法を定義します。今回はクライアント側にOracleクライアントがインストール済みなのでOCIを選択しました(簡易TNSって楽でいいですねー)。Oracle Clientがインストールされていない環境用にDirect接続もできるようですが、AdvancedタブでSIDやもろもろを設定しても上手くつながりませんでした。

テーブル名を複数形にする必要は無いので、Pluralize EntitySet and table propertiesはOFF、テーブル名のアンダーバーを削ったり短くしたりする必要もないのでCapitalize Property NamesもOFFでデータソースを定義します。

image

クエリーを実行してみる。

ORACLE側で定義されているテーブルに対して、LINQ経由でクエリーを実行してみましょう。

CREATE TABLE KARUATEST ( 
ID NUMBER(28) NOT NULL,
NAME VARCHAR2(100),
CONSTRAINT PK_KARUATEST PRIMARY KEY(ID)
)
 
NAMEの先頭が”karua”で始まっているもの。
KARUATEST.Where(user => user.NAME.StartsWith("karua"))

image

でました。

大文字、小文字無視で。
KARUATEST.Where(user => 
user.NAME.StartsWith("karua", StringComparison.InvariantCultureIgnoreCase))
image
あれ?結果が変わりませんね。SQLタブを見てみると。
SELECT t0.ID, t0.NAME
FROM KARUATEST t0
WHERE (t0.NAME LIKE :p0 || '%')

うーん、StringComparison.InvariantCultureIgnoreCaseを考慮してくれないようです。
こうかな?
KARUATEST.Where(user => user.
NAME.ToUpper().StartsWith("karua".ToUpper()))

image
上手く出ました。このあたりの解釈は、IQueryableのドライバーによって変わってきますね。
SQLを見てみるとこんな感じに展開されています。
SELECT t0.ID, t0.NAMEFROM KARUATEST t0
 WHERE (UPPER(t0.NAME) LIKE :p0 || '%')

もちろんこのクエリーだとカラム側にUPPER関数が実行されるので、関数インデックスがない場合はSQL的によろしくないですが、まぁとりあえずいいでしょう。パラメーター側はちゃんと.NET側で大文字にしてからバインド変数に渡していますね。

まとめ

実際の動作は各LINQプロバイダーによって動作が変わってくるので、実際の動作は動作環境に合わせてプログラム側で確認する必要があります。場合によっては、IQ側ではサポートされているけれど、ODP.NET側ではサポートされていないってことがあり得る。

もちろん実際のプログラムにでもIQToolkitを使ってプログラミングしてあげればいいんでしょうが、そうも言えないと思うので、LINQ Padでの確認は、こんな文法で行けるかなってのをなんとなく確認するという感じにとどめたほうがいいでしょう。

カテゴリー:プログラミング, メモ, Oracle タグ:
  1. まだコメントはありません。
  1. No trackbacks yet.

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。