Entity Framework Core でデータベースを検索する - C#

Entity Framework Core でデータベースのテーブルを検索するコードを紹介します。

プログラム1: SQL Serverで検索条件式がある例

事前準備

モデルとDbContextを作成します。作成手順はこちらの記事を参照してください。

今回のデモで使用するProductsBテーブルは下記の値となります。
ProductsBテーブル
idmodelnameclasscategoryprice
1C-XM01モーダンチェアホームチェア56000
2X-XD05ラージデスクオフィステーブル87000
3A-DA40ラウンドダイニングチェアホームチェア28000
4O-XX100ナチュラルオフィスオフィスチェア13800
5R-D400ラウンドダイニングテーブルホームテーブル128000
6R7000ウッドキャビネットオフィスその他32000
7B-200リネンベッドホームベッド184500
8B-250ホワイトダブルベッドホームベッド324850
9W-80ワーキングチェアオフィスチェア45000
10EG-10Xエルゴノミクスデスクオフィステーブル88500
11OC-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テーブルは下記の値となります。
Rec
IDNameCategoryPrice
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
iPentec all rights reserverd.