LINQとは
LINQについて、Webサイトで調べると、"LINQはプログラミング言語(C#やVB)に統合されたクエリ用言語です。通常データベースアクセスに使用するSQLが、C#やVBのプログラム内では文字列として扱われるのに対し、LINQはそれ自体が言語に統合されたクエリとして認識されます。( 参考 )などと書かれていたりしますが、書籍管理アプリでLINQを使う場合のサンプルがあったほうが、わかりやすいかと思いますので、サンプルを貼っていきます。
基本的な考え方
ここでは、蔵書テーブルに対するやり取りのサンプルコードを使用します
- クエリ文の宣言
1 |
var Books = from m in _context.BookCollection select m; |
- 条件を加える
1 2 |
// 廃棄フラグが0の場合という条件を加える Books = Books.Where(s => s.FlgDisposal == "0"); |
- リストとして実体化する
1 2 |
// ここでは、非同期でクエリ文を実行して、BookListにテーブルのデータをリストにして格納しています。 var BookList = await Books.ToListAsync(); |
1~3までの処理を一行にまとめる
1 |
var BookList = await _context.BookCollection.Where(s => s.FlgDisposal == "0").ToListAsync(); |
処理を一行でまとめるとシンプルなコードが書けるのですが、 クエリ文を作成するところと、実体化する部分を分けることによって 、検索やソートの処理を簡単に実装することができます。以下は参考です。
Microsoft Document→ ASP.NET Core の Razor Pages と EF Core – 並べ替え、フィルター、ページング
やりがちなミス
演習を進めていくと、貸し出しテーブルの「ステータス」と書籍マスタの書籍名を一つのページに表示させたいという場面があるかと思います。
その時に、以下のようにLINQを書くと、上手くいきません。
1 2 3 4 |
// BooksにBookCollectionテーブルとBorrowBooks、Booksテーブルの内容を格納したい var Books = await _context.BookCollection.Include(x => x.BorrowBooks).Include(x => x.IsbnNavigation).ToListAsync(); // ↑この部分がおかしい。 モデルのコードを見ればわかるのですが、 // ICollection<BorrowBooks>で宣言されています。 |

理由としては、上の図を見てもらえば分かると思うのですが、テーブルの設計上、BorrowBooksテーブルからしか、Booksテーブルの内容を参照できないことが原因になります。
他のテーブルのデータを取ってきたい場合は、青い矢印でたどっていくように、以下のようにコードを書くと上手くいくと思います。
1 2 3 |
var Books = _context.BorrowBooks .Include(x => x.IdBookNavigation.IsbnNavigation) .Include(x => x.IdBookNavigation.IsbnNavigation).ToListAsync(); |
コメントを残す