C# 内部結合
C# Linqでinner Joinした結果を表示
最初に
現場で使っている技術や、教えてもらったことをアウトプットしていきたいので、記事にしてみました。
今回は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>
var TeamQuery = _context.Set<Team>
//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クラスに定義したPersonとTeamに代入
View
PersonTeam.cshtml
ほぼドキュメント通りなので参考リンク置いときます。
コントローラーの記述が違うのでViewに渡す@modelの部分を変更。
@model IEnumerable<Dto>
DtoクラスのPersonとTeamを呼ぶのでこの形になります。
@Html.DisplayNameFor(model => model.Person.PersonId)
@Html.DisplayFor(modelItem => item.Person.PersonId)
結果
最後に
sqlに繋ぐための設定は、以下のファイルに記述していきます。
appsetting.json Startup.cs
Microsoftのドキュメントに詳しく載ってるのでこちらを参考にしました。