プログラミング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

Spring Framework 実行環境メモ

Spring FrameWorkの勉強のため、書籍を購入。

詰まった点等をメモります。

 

開発環境 Eclips Pleades all in one Eclips

Jdk-12.0.2   jre1.8.0_211

 

必要なもの jdk + STS + Gradle

STS(Spring Tool Suite)+Gradleに関しては、ヘルプ→eclipseマーケットプレイスにてDL確認

jdkjavaアプリケーション作成時にinstall済み。

 

Pleades install時にspring Frameworkを使うための必要なものがほぼそろっているので

プロジェクト作成。

注意点はjava8を選ぶこと。

 

もし違うverを選んでしまった場合。

java-1.8じゃないと対応してないので、変更。

プロジェクト→プロパティ→javaのビルドパス→ライブラリ→JREシステムライブラリ→編集→実行環境java-se1.8

f:id:Tokuty:20190923200302p:plain

後は参考書籍通りにうまくいけば、

f:id:Tokuty:20190923201400p:plain

となります。

 

参考書籍:spring Boot プログラミング入門2 著者:掌田 津耶乃 

githubメモ①

mkdir フォルダ名                                         フォルダ新規作成

cd フォルダ名                                              パス

git init                                            gitリポジトリ新規作成

touch README.md                                     README.ad作成

echo$ "" > README.md                                   中身に書き込み

git add ファイル名                                    追加(commit対象)

git commit -m 'メッセージ'add                            commit

git commit -m 'メッセージ'add -- ファイル名     1つcommit

git log --oneline                                                      git commit log

git rebase -i  HEAD~数字                                       書き換え

git remote add origin url                                         githubのurl

git push origin master                                            github push 反映させる

 

matches

入力時のチェック文字と文字数チェック

f:id:Tokuty:20190908224602p:plain

 

matches("[a-z0-9]{6,8}")

a-z0-9までの文字が使えて、6~8文字までならtrueを返す。それ以外ならfalse

("[a-z]{1}+[0-9]{6,8}") これだと最初の一文字が記号で後は数字

他にも日付や郵便番号等にも使えるのでかなり便利。

コンソールでログイン機能②

新規登録してからログインまで。①からの追加分。

実行(新規登録+ログイン)

f:id:Tokuty:20190907234034p:plain

javabeans

f:id:Tokuty:20190907234157p:plain

ログイン処理

f:id:Tokuty:20190907234338p:plain

入力結果

f:id:Tokuty:20190907234815p:plain

新規登録 id+password入力→javabeansにidとpasswordを送る

ログイン id+password入力→ログイン処理

javabeansに送られたid+password とログイン時に入力したid+passwordをチェック

一致したらtrueを返す。

今後の目標:登録時の文字数チェック等。

コンソールでログイン機能

まずはコンソール画面で作成。

実行

f:id:Tokuty:20190905230738p:plain

ログイン処理

Logic

f:id:Tokuty:20190905230825p:plain

結果表示

f:id:Tokuty:20190905231442p:plain

id1111 password2222 入力。

idとpasswordが一致すればtrueを返す。

今後の目標:新規id+password登録→ログインの形にしたい。