Entity Framework Core でデータベースのテーブルを検索するコードを紹介します。
プログラム1: SQL Serverで検索条件式がある例
事前準備
モデルとDbContextを作成します。作成手順は
こちらの記事を参照してください。
今回のデモで使用するProductsBテーブルは下記の値となります。
ProductsBテーブルid | model | name | class | category | price |
1 | C-XM01 | モーダンチェア | ホーム | チェア | 56000 |
2 | X-XD05 | ラージデスク | オフィス | テーブル | 87000 |
3 | A-DA40 | ラウンドダイニングチェア | ホーム | チェア | 28000 |
4 | O-XX100 | ナチュラルオフィス | オフィス | チェア | 13800 |
5 | R-D400 | ラウンドダイニングテーブル | ホーム | テーブル | 128000 |
6 | R7000 | ウッドキャビネット | オフィス | その他 | 32000 |
7 | B-200 | リネンベッド | ホーム | ベッド | 184500 |
8 | B-250 | ホワイトダブルベッド | ホーム | ベッド | 324850 |
9 | W-80 | ワーキングチェア | オフィス | チェア | 45000 |
10 | EG-10X | エルゴノミクスデスク | オフィス | テーブル | 88500 |
11 | OC-908 | オーガニックチェア | ホーム | チェア | 56000 |
UI
下図のフォームを作成します。
今回のプログラムではボタンを1つのみ[Select where](button2)を利用します。
コード
下記コードを記述します。
namespace SimpleEntityFrameworkCoreSqlServer
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void button2_Click(object sender, EventArgs e)
{
IPentecSandBoxContext cx = new IPentecSandBoxContext();
IEnumerable<ProductsB> result = cx.ProductsBs.Where(item => item.Price >100000);
foreach (ProductsB pb in result) {
textBox1.Text += string.Format("{0:d} - {1} / {2} / {3} / {4} - {5:g}\r\n", pb.Id, pb.Name.Trim(), pb.Model.Trim(), pb.Category.Trim(), pb.Class.Trim(), pb.Price);
}
}
}
}
解説
コンテキストのオブジェクトを作成します。
IPentecSandBoxContext cx = new IPentecSandBoxContext();
レコードを検索します。レコードの検索はWhereメソッドを利用します。メソッドの引数に条件判定のメソッドを与えます。
戻り値または値がtrueとなるレコードが検索結果に含まれる動作になります。
下記のコードでは、レコードのPriceフィールドの値が 100000 より大きいレコードを検索します。
検索結果のレコードは、
IEnumerable<ProductsB>
オブジェクトで返されます。
IEnumerable<ProductsB> result = cx.ProductsBs.Where(item => item.Price >100000);
foreachループで
IEnumerable<ProductsB>
オブジェクトの要素の値をテキストボックスに表示します。
foreach (ProductsB pb in result) {
textBox1.Text += string.Format("{0:d} - {1} / {2} / {3} / {4} - {5:g}\r\n", pb.Id, pb.Name.Trim(), pb.Model.Trim(), pb.Category.Trim(), pb.Class.Trim(), pb.Price);
}
実行結果
プロジェクトを実行します。下図のウィンドウが表示されます。
[Select where]ボタン(button2)をクリックします。テーブルを検索し検索結果のレコードの値がテキストボックスに表示されます。
プログラム2: SQL Serverですべてのレコードを取得する例
UI
下図のフォームを作成します。
今回のプログラムではボタンを1つのみ[Select All](button1)を利用します。
コード
以下のコードを記述します。
namespace SimpleEntityFrameworkCoreSqlServer
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
IPentecSandBoxContext cx = new IPentecSandBoxContext();
IEnumerable<ProductsB> result = cx.ProductsBs;
foreach (ProductsB pb in result) {
textBox1.Text += string.Format("{0:d} - {1} / {2} / {3} / {4} - {5:g}\r\n",
pb.Id, pb.Name.Trim(), pb.Model.Trim(), pb.Category.Trim(), pb.Class.Trim(), pb.Price);
}
}
}
}
解説
すべてのレコードを取得する場合は、テーブルのDbSetオブジェクトをそのまま利用します。
今回のコードでは、
IEnumerable<ProductsB>
変数に代入し、
foreach
ループで個々の要素にアクセスしテキストボックスにレコードの値を表示しています。
実行結果
プロジェクトを実行します。下図のウィンドウが表示されます。
[Select All]ボタンをクリックします。すべてのレコードの値がテキストボックスに表示されます。
プログラム3: SQL Serverで1つのレコードを取得する例
idで検索条件を指定し、1つのレコードを取得する場合には、Singleメソッドを利用します。
UI
下図のフォームを作成します。
今回のプログラムではボタンを1つのみ[Select 1 Record](button6)を利用します。
コード
以下のコードを記述します。
namespace SimpleEntityFrameworkCoreSqlServer
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void button6_Click(object sender, EventArgs e)
{
IPentecSandBoxContext cx = new IPentecSandBoxContext();
ProductsB result = cx.ProductsBs.Single(item => item.Id == 7);
textBox1.Text += string.Format("{0:d} - {1} / {2} / {3} / {4} - {5:g}\r\n",
result.Id, result.Name.Trim(), result.Model.Trim(), result.Category.Trim(), result.Class.Trim(), result.Price);
}
}
}
解説
1つのレコードを取得する場合は、テーブルのDbSetオブジェクトの
Single()
メソッドを呼び出します。
パラメーターに検索条件式を設定します。下記コードではidの値が7のレコードを取得します。
ProductsB result = cx.ProductsBs.Single(item => item.Id == 7);
実行結果
プロジェクトを実行します。下図のウィンドウが表示されます。
[Select 1 Record]ボタンをクリックします。id=7 のレコードの情報がテキストボックスに表示されます。
プログラム4: SQLiteの例
事前準備
モデルとDbContext、テーブルのレコードを作成します。作成手順は
こちらの記事を参照してください。
今回のデモで使用するRecテーブルは下記の値となります。
RecID | Name | Category | Price |
1 | ぺんぎんクッキー | 焼き菓子 | 240 |
2 | らくだキャラメル | 生菓子 | 85 |
3 | しろくまアイス | 氷菓 | 320 |
UI
下図のフォームを作成します。
今回のプログラムではボタンを1つのみ[Select where](button4)を利用します。
コード
下記コードを記述します。
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Storage;
namespace SimpleEntityFrameworkCoreSqlite
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void button4_Click(object sender, EventArgs e)
{
MyContext mc = new MyContext();
IEnumerable<MyRec> result = mc.Rec.Where(item => item.Price > 100);
foreach (MyRec m in result) {
textBox1.Text += string.Format("{0:d} {1} {2} {3:d}\r\n", m.ID, m.Name, m.Category, m.Price);
}
}
}
}
解説
コードはSQL Serverのデータベースと接続する場合と同様です。
コンテキストのオブジェクトを作成します。
MyContext mc = new MyContext();
レコードを検索します。レコードの検索はWhereメソッドを利用します。メソッドの引数に条件判定のメソッドを与えます。
戻り値または値がtrueとなるレコードが検索結果に含まれる動作になります。
下記のコードでは、レコードのPriceフィールドの値が 100 より大きいレコードを検索します。
検索結果のレコードは、
IEnumerable<MyRec>
オブジェクトで返されます。
IEnumerable<MyRec> result = mc.Rec.Where(item => item.Price > 100);
foreachループで
IEnumerable<MyRec>
オブジェクトの要素の値をテキストボックスに表示します。
foreach (MyRec m in result) {
textBox1.Text += string.Format("{0:d} {1} {2} {3:d}\r\n", m.ID, m.Name, m.Category, m.Price);
}
実行結果
プロジェクトを実行します。下図のウィンドウが表示されます。
[Select where]ボタン(button4)をクリックします。Priceの値が100より大きいレコードの値がテキストボックスに表示されます。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2023-05-08
作成日: 2022-11-24