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