LINQ to Entities その1

LINQ to Entities その1


【LINQとは】

LINQとは、オブジェクト・データベース・データセット・エンティティ・XMLなど、アプリケーションで
扱う様々なデータソースに対して統一的な手段でアクセスするしくみ。
LINQはアクセスするデータの種類に応じてLINQ to Objects、LINQ to SQL、LINQ to XML、LINQ to Dataset
などに分類できるが、特に開発者が意識する必要はない。
Entity Data ModelにアクセスするためのLINQのことをLINQ to Entitiesと呼ぶ。

LINQによる問い合わせは大きく分けて2つある。
・クエリー式構文
 シンプルだがすべての問い合わせを表現できるわけでない。
・メソッド構文
 コードは冗長になるが、LINQのすべての機能を表現できる。

クエリー式構文

以下は抽出したデータのタイトルを取得するLINQクエリーの例
[データ]
48
[LINQクエリー例]

[ビュー]

[出力結果]
49


他にも、group, orderby, into, join 等も使える。
 
①From 句
 From 範囲変数 In データソース
上記の例だと、データソースがDbSet(Of Article)オブジェクトで、範囲変数はArticleエンティティを表す。
データソースには、オブジェクト配列やDataSetオブジェクトやXElement(要素ノード配列)を指定できる。
データソースに指定できる条件は、オブジェクトがIEnumerable(Of T)/IEnumerableインターフェースまたは
その派生インターフェースを実装していること。DbSet(Of T)オブジェクトなど。
(For Each で処理できるオブジェクトであれば利用できる)

②where 句
AndAlso なども使えて、複雑な条件も指定できる。
 
③select 句
問い合わせの出力形式を指定する。
上記の例では、a.Titleで、ArticleエンティティのTitleプロパティの集合 IQueryable(Of String)を返す。
範囲変数(Articleエンティティ)の内容をそのまま返したい場合は、「select a」とする。(select * と同意)
 
複数のプロパティを取得したい場合は以下のようにも記述できる。
Articleエンティティから取り出したTitleとUrlプロパティを匿名型に詰め直して返している。
[LINQクエリー例]

[ビュー]

[出力結果]
50


メソッド構文

クエリー式は、コンパイラーによってメソッド構文に置換されて実行される。
つまり、クエリー式で書ける内容はメソッド構文でも書けるということ。しかし、その逆は不可。
例えば、MinやMaxメソッドに対応するクエリー式は無い。
 
上記の例をメソッド構文を使って書き換えたのが以下

クエリー式のFromに相当するメソッドは無く、データソースから直接メソッドを呼び出せるが、
WhereやSelectでは、ラムダ式で表す必要がある。(変数aは対象のエンティティを表す)
 

遅延実行

クエリー式構文・メソッド構文に関わらず、LINQでは遅延実行で処理される。
遅延実行では、クエリーの定義によってすぐにDBに問い合わせが実行されるわけではなく、結果が必要に
なったところで初めてDBに対して問い合わせが行われる。
 
遅延実行をその場で確定させたい場合には、ToListメソッドを呼び出せばいい。

【データの検索条件を指定する(where句)】

以下は検索条件でArticlesテーブルのデータを絞り込むための例

コントローラー[ArticlesController.vb]

Whereメソッドを続けて使用した場合、ANDで連結される。
Containsメソッドを使用することにより、SQLのLIKEに相当する検索を実装できる。
含んでいないことを条件とする場合は、NOT演算子を前につける。
他にも、以下のメソッドも使用できる。
・StartsWith:前方一致検索
・EndsWith:後方一致検索
 
ビュー[Search.vbhtml]

arrow_down
[出力結果(画面)]
・条件指定なしの場合
51
・条件指定した場合
52
[補足]
Whereメソッドの特殊系として、Singleメソッドがある。単一のデータを取得するメソッドで、
複数件取得されたり、空の場合は例外を発生する。
結果が空の場合に型に応じたデフォルト値を返したい場合は、SingleOrDefaultメソッドを利用する。

【データを並べ替える(Order By句)】

取得したデータを並べ替えるには。クエリー式ではOrder By句を利用する。

[ArticlesController.vb]

降順はDescendingで表す。
デフォルトはAscendingで省略可能。
列そのものによるソートだけではなく、例えば「a.Title.Length」のようにタイトルの文字列長でソート
するようなこともできて、SQLのソートよりも応用が効く。


一方、メソッド構文では書き方がかなり異なる。
[ソート関連のメソッド]

メソッド 概要
OrderBy 昇順にソート
OrderByDescending 降順にソート
ThenBy 昇順にソート(第2キー以降)
ThenByDescending 降順にソート(第2キー以降)

メソッド構文では、昇順・降順で異なるメソッドを利用し、第1キーと第2キー以降とでも異なるメソッド
を使い分ける点に注意が必要。
以下はメソッド構文で書き換えた例
[ArticlesController.vb]

【ソート可能なグリッド表を作成する】

ソート可能なグリッド表の例
タイトルをクリックするとデータを昇順・降順に並べ替える。

コントローラー[ArticlesController.vb]

ビュー[Sort.vbhtml]

arrow_down
[出力結果(画面)]
53
各タイトルには、@Html.ActionLinkによって、以下のようなリンクが生成されている。

FF:wetサイトのroot
Articles:コントローラー名
Sort:アクション名
strSort:パラメーター(Sortアクションの引数として渡される)