JoinされたLINQ の結果を匿名型ではない、クラスオブジェクト型で受け取る - C#

JoinされたLINQ の結果を匿名型ではない、クラスオブジェクト型で受け取るコードを紹介します。

概要

こちらの記事ではEntity Framework Coreを利用して、テーブルのJOINをするコードを紹介しました。 Entity Framework Coreではデータベースへの問い合わせはLINQを利用しますが、紹介したJOINのコードではレコードの結果をIQueryable<dynamic>型で受け取ります。
データ型を意識しないため、便利ではありますが、型に厳しくコードを記述したい場合や、オートコンプリートを活用してコードを記述したい場合は、 匿名型やdynamicではなく、クラスオブジェクト型でLINQの結果を受け取りたいです。
この記事では、LINQの結果を匿名型ではないクラスオブジェクトで受け取るコードを紹介します。

方針

LINQのselect句、または、返却値を設定するパラメーターで、オブジェクトを作成し値を設定して返却します。

プログラム例

テーブル

こちらの記事に掲載している、ProductsD テーブル、ProductsDstockPlace テーブルを利用します。

Scaffold-DbContext

Entity Framework Coreのパッケージをインストールし、Scaffold-DbContextを実行します。

UI

下図のフォームを作成します。今回は[Button3]のみを利用します。

コード

下記コードを記述します。
using EntityFrameworkCoreJoin.Models;

namespace EntityFrameworkCoreJoin
{
  public partial class FormMain : Form
  {
    public class JoinResultType
    {
      public ProductsD pdt { get; set; }
      public ProductsDstockPlace pdspt { get; set; }
    }

    public FormMain()
    {
      InitializeComponent();
    }

    private void button3_Click(object sender, EventArgs e)
    {
      IQueryable<JoinResultType> rec;
      IPentecSandBoxContext sc = new IPentecSandBoxContext();
      rec = sc.ProductsDs.Join(
        sc.ProductsDstockPlaces,
        pd_table => pd_table.Stockplace, 
        pdsp_table => pdsp_table.Id,
        (pd_table, pdsp_table) => new JoinResultType() { pdt = pd_table, pdspt = pdsp_table });

      foreach (var r in rec) {
        textBox1.Text += string.Format("{0} \\{1:d} - {2}\r\n", r.pdt.Name.Trim(), r.pdt.Price, r.pdspt.Name.Trim());
      }
    }

  }
}

クエリ構文で記述する場合は以下のコードになります。
    private void button3_Click(object sender, EventArgs e)
    {
      IQueryable<JoinResultType> rec;
      IPentecSandBoxContext sc = new IPentecSandBoxContext();

      rec = from pd_table in sc.ProductsDs join pdsp_table in sc.ProductsDstockPlaces on pd_table.Stockplace equals pdsp_table.Id 
        select new JoinResultType { pdt = pd_table, pdspt = pdsp_table };

      foreach (var r in rec) {
        textBox1.Text += string.Format("{0} \\{1:d} - {2}\r\n", r.pdt.Name.Trim(), r.pdt.Price, r.pdspt.Name.Trim());
      }
    }

解説

メソッド構文の場合でJoinメソッドを利用する場合は、第四引数で戻り値の型と値を指定できます。引数内のラムダ式でJoinResultTypeクラスを作成し、 プロパティに値を代入して返却値とします。この記述により、IQueryable<JoinResultType>型で結果を受け取れます。
  rec = sc.ProductsDs.Join(
    sc.ProductsDstockPlaces,
    pd_table => pd_table.Stockplace, 
    pdsp_table => pdsp_table.Id,
    (pd_table, pdsp_table) => new JoinResultType() { pdt = pd_table, pdspt = pdsp_table });

クエリ構文の場合は、select句で返却値と型を設定できます。select句で JoinResultTypeクラスを作成し、プロパティに値を代入して返却値とします。 この記述により、IQueryable<JoinResultType>型で結果を受け取れます。
   rec = from pd_table in sc.ProductsDs join pdsp_table in sc.ProductsDstockPlaces on pd_table.Stockplace equals pdsp_table.Id 
    select new JoinResultType { pdt = pd_table, pdspt = pdsp_table };

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[button3]をクリックします。テキストボックスに下図の結果が表示されます。Joinの結果が表示できています。


LINQ の結果を匿名型ではない、クラスオブジェクト型で受け取れました。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2023-06-17
作成日: 2023-06-17
iPentec all rights reserverd.