プログラミングBlog

C# 内部結合

C# Linqでinner Joinした結果を表示

最初に

現在C# linqを現場で使用しています。

現場で使っている技術や、教えてもらったことをアウトプットしていきたいので、記事にしてみました。

今回はinner joinやViewに表示する部分について書きます。

Model

オレンジの部分が紐づけするテーブルデータです。

Person.cs

  • public int PersonId { get; set; }
  • public string Name { get; set; }
  • public string Mail { get; set; }
  • public int TeamId { get; set;}
  • public string TeamName { get; set;}

Team.cs

  • public int TeamId
  • public string TeamName
  • public string HeadQuarterName { get; set; }
  • public string Place { get; set;}

Dto

複数のテーブルデータを格納するクラス。結合後にPersonとTeamを呼び出すために必要

Dto.cs

  • public Person Person { get; set; }
  • public Team Team { get; set; }

Context

Context.cs

public class Context : DbContext

{

       public Context(DbContextOptions<Context> options)

                 : base(options)

       {

       }

       public DbSet<Person> Person{ get; set; }

       public DbSet<Team> Team{ get; set; }

}

DBから読み込むためのテーブル名を記述しています。

Controller部分やテーブルを呼び出す際に使用します。

Controller&linq記述

PeopleController.cs

private readonly Context _context;

public PeopleController(Context context)

{

_context = context;

}

public IActionResult PersonTeam()

{

①  var PersonQuery = _context.Set<Person>().AsNoTraciking();

      var TeamQuery = _context.Set<Team>().AsNoTraciking();

      //inner join!!

      var PTQuery = PersonQuery.Join(

                              TeamQuery,

                        ②   p => new { p.TeamId, p.TeamName},

                              t  => new { t.TeamId, t.TeamName},

                        ③  (p,t) => new Dto

                              {

                                   Person = p,

                                       Team = t

                              });

       //ここまで

       return View(PTQuery);

}

①_context.Setでテーブルデータを格納する。

    AsNoTracikingでテーブルのデータが多い時にメモリ不足になる可能性があるので

    読み取り専用にする。

②共通するカラムの紐づけ  カラムが一つの場合はnewなしの記述もできる。

Dtoクラスのインスタンス生成

Dtoクラスに定義したPersonとTeamに代入

View

PersonTeam.cshtml

ほぼドキュメント通りなので参考リンク置いときます。

https://docs.microsoft.com/ja-jp/aspnet/core/tutorials/razor-pages/page?view=aspnetcore-3.1&tabs=visual-studio

コントローラーの記述が違うのでViewに渡す@modelの部分を変更。

@model IEnumerable<Dto>

DtoクラスのPersonとTeamを呼ぶのでこの形になります。

@Html.DisplayNameFor(model => model.Person.PersonId)

@Html.DisplayFor(modelItem => item.Person.PersonId)

結果

f:id:Tokuty:20200201222531p:plain

inner join

最後に

sqlに繋ぐための設定は、以下のファイルに記述していきます。

appsetting.json Startup.cs

Microsoftのドキュメントに詳しく載ってるのでこちらを参考にしました。

https://docs.microsoft.com/ja-jp/aspnet/core/tutorials/razor-pages/model?view=aspnetcore-3.1&tabs=visual-studio