■Entity SQLの俺メモ

なんか最近、LINQ to EntitesやObjectQueryで複雑なクエリでもExpressionとかを
多用して、誰が読めるんだ・・・みたいな複雑なクエリをうーん、うーん・・と悩みながら頑張って
書いてたんだけど、複雑なクエリはEntity SQLを直接書いた方が早いことに気づいた。

最初はMicrosoft独自の謎のSQLなんか覚えたくないなぁ・・・と敬遠してたんだけど、
かなり標準的なクエリに近いことが分かった。oracleやsqlserverみたいな主要なRDBのSQLに
慣れてる人なら、なんら違和感なく書けると思う。

めんどうなので箇条書きです。。

前提条件として、Entity SQLはあくまでも、Entity Data Model(EDM)に対してのクエリなので、
from句のテーブルの指定は、EDM名.テーブル名 のように修飾する必要がある。

・where
・left join
・inner join
・group by
・order by
ページングの実装に便利そうな、SKIPを指定することで先頭n行をスキップでき、
LIMITで何行取得するかを指定できるみたい。ただしselect句のTOPと併用はできないので注意。

・演算子
比較演算子は、LIKE(escapeを記述することで、エスケープ文字の指定可)、
BETWEENIS (NOT) NULL も使える。

・論理演算子
ANDNOTORCASE WHEN..THEN..ELSE..END
・集合演算子
EXISTSIN(括弧ではなく中括弧 { } で括る必要がある)、UNION

上記は、基本的にRDBと全く同じ記述で書けた。

ただし、select 句が少しだけ特殊で、RDBで取得されてくる一般的なイメージで取得するには、

select value row(tbl.field1, tbl.field2) from

のような感じに書かなきゃないみたい。 distincttopも指定可。 * (アスタリスク)は使えないので注意。
これは集計関数になるけど、count(*)はcount(0)で同じ結果になるみたい。

 

このように基本的な構文はかなり違和感なく書けることが分かると思う。
ただし組み込み関数については、RDBごとに実装が違ったように、Entity SQLでも使えるものが異なる。

Entity SQLの正規関数(名前空間 EDM)については、リファレンスを参照。

Microsoft プロバイダー固有の関数も使えるみたい。SqlServer 名前空間を指定して使用。以下のような感じ。 
select SqlServer.LEN(…) from

以上、本当に箇条書き。自分でやってみたものや、目に付いたものを書いているだけで、
書いていないことはいっぱいあるので、リファレンスを一読することをオススメします。。

でも、敬遠してた人は余裕に思えてきたのでは!

コメントを残す