GROUP JOINの複数結合について(Linq To Entities )

なんかうまく行ったので残しておきます。
絶対にSQLで書いたほうが見やすくメンテもし易いと思いますが。。

さて、話を戻して複数条件の結合方法です!
下記のようなテーブルから、データを結合させて出力するパターンです。
f:id:daichi-t-0123:20161102144039p:plain

AAA、BBB、CCCの3つのテーブルをもとにDDDのテーブルを作成します。

Dim con As New DATABASS
Dim JoinList = con.CCC.GroupJoin(con.AAA, Function(ccc) New With {Kye .ID = Ctype(ccc.社員ID,Integer), Kye .コード = Ctype(ccc.部署コード,Integer)},
                                          Function(aaa) New With {Kye .ID = Ctype(aaa.社員ID,Integer), Kye .コード = Ctype(aaa.部署コード,Integer)},
                                          Function(ccc, aaa) New With {ccc, aaa}) _
                      .SelectMany(Function(Sccc) Sccc.aaa.DefaultIfEmpty(), Function(ccc, aaa) New With {ccc.ccc, aaa}) _
                      .GroupJoin(con.BBB, Function(ccc) ccc.ccc.部署コード, aaa.部署コード, Function(ccc, bbb) New With {ccc, bbb}) _
                      .SelectMany(Function(Sccc) Sccc.bbb.DefaultIfEmpty(), _
                                  Function(ccc, bbb) New With {Key .SEQ = ccc.ccc.SEQ,
                                                               Key .名前 = ccc.aaa.名前,
                                                               Key .部署名 = bbb.部署名,
                                                               Key .請求書発行NO1 = ccc.ccc.請求書発行NO}).ToArray

※ポイントは「GROUPJOIN」のキーの型を比較元と比較先で合わせる。
※integer?とintegerは別として扱われるため注意。
そんなのも知らないのかと思われますが、「?」がつくとNullが入っててもOKとするような意味合いになります。

出力は変わらないので前の記事を参照して下さい。
mmdaics.hateblo.jp

以上。

JOINやGROUPJOINで複数条件の結合を実施する方法(Linq To Entities )

Dim List = (From AAA In aaa Join BBB In bbb On AAA.コード
            Equals AAA.コード And BBB.コード Equals AAA.ID Order By BBB.ID) _
            .Select(Function(AAABBB) New With{Key .部署コード =AAABBB.AAA.コード,
                                              Key .個人ID = hoktok.AAA.ID,
                                              Key .担当者名 = AAABBB.BBB.名前}).ToArray

DefaultIfEmptyを使用すれば、LeftJoinもできます。
ただ結合条件を固定値でみれないです。(例えば、1 Equals AAA.コード )

SQLを直接記述して実行(Linq To Entities )

今回はLinqSQL文を直接記述してデータベースと通信しようという話です。

ん?それなら、SQL文だけで良いじゃないかって?

た、多分、こっちのほうが処理速度が向上するんですよきっと(*_*)!!


そんなわけで、記述方法載せておきます。

'登録
Dim Data1 As Integer = con.Database.ExecuteSqlCommand("INSERT FROM AAA")
'変更
Dim Data2 As Integer = con.Database.ExecuteSqlCommand("UPDATE FROM AAA")
'削除
Dim Data3 As Integer = con.Database.ExecuteSqlCommand("DELETE FROM AAA")

※integer型に入るのは処理件数(?)
 実際に調べていないので、間違っている可能性あります。。。

'取得
Dim Data4 = con.Database.SqlQuery(Of AAA)("Select * FROM AAA")

どちらも、本当にSQL文そのままでしたねw
試してないですけど、取得したデータはいつもの「For Each」で出力可能だと思います。

あやふやな内容で申し訳ないのです(><)
一応、メモと言うことで参考までにしておいて下さい。

以上!

GROUP JOINについて(Linq To Entities )

GROUP JOINについて今回は書きたいと思います。
前回のJOIN同様に微妙な感じですけど、参考になればと思います。

まずは検索から

Dim con As New DATABASS
Dim JoinList = con.AAA.GroupJoin(con.BBB, Function(x) x.ID, _
                     Function(y) y.ID, _
                     Function(x, z) New With { _
                         Key .ID = x.ID, _
                         Key .年齢 = x.年齢 _
                         Key .名前 = y.名前, _
                         Key .部署マスタ' = z, _
                     }) _
                    .Where(Function(x) CType(x.ID >= 30 And _
                                             x.年齢 >= 50), Boolean)) _
                    .OrderBy(Function(x) x.ID) _
                    .ThenBy(Function(x) x.年齢)

JOINとの違いです、
 1:「con.AAA.Join」→「con.AAA.GroupJoin
 2:「Function(x, y) New With { _」→「Function(x, z) New With { _」
 3:「Key .部署 = y.部署, _」→「Key .部署マスタ' = z, _」
この書き方により、できるテーブルの形が変わります。
 JOINの場合
  ・ID
  ・年齢
  ・名前
  ・部署名

 GROUP JOINの場合
  ・ID
  ・年齢
  ・名前
  ・部署マスタ'
   ・ID
   ・部署
   ・席番号
   ・部下数

要する基準となるテーブルに結合したいテーブルをまるまる結合した感じです。
これにより、結合すべきIDが見つからないときは部署マスタ'は作成されません。

出力も少し変わります。

For Each LoopData In JoinList
    GetListData = String.Empty
    GetListData = GetListData & clsString.SetSpace(CType(LoopData.ID, String), 5, clsString.emLR.Left) & " "
    GetListData = GetListData & clsString.SetSpace(LoopData.年齢, 3, clsString.emLR.Right) & " "
    GetListData = GetListData & clsString.SetSpace(CType(LoopData.名前, String), 20, clsString.emLR.Left) & " "
    If LoopData.部署マスタ'(0) Is Nothing Then
        GetListData = GetListData & String.Empty & " "
    Else
        GetListData = GetListData & clsString.SetSpace(JoinList1.部署マスタ'(0).部署, 10, clsString.emLR.Right)
    End If
    lstData.Items.Add(GetListData)
Next

色々やってみましたが、やはりJOINとGROUP JOINはややこしいですね。。。
テーブルが3つ以上の結合は次回書こうと思います。

書くことが出来ましたので記載しておきます。
mmdaics.hateblo.jp


以上。

JOINについて(Linq To Entities )

JOINについて今回は書きたいと思います。
ただ、あまりいい書き方では無いかもしれません。

まずは検索から

Dim con As New DATABASS
Dim JoinList = con.AAA.Join(con.BBB, Function(x) x.ID, _
                     Function(y) y.ID, _
                     Function(x, y) New With { _
                         Key .ID = x.ID, _
                         Key .年齢 = x.年齢 _
                         Key .名前 = y.名前, _
                         Key .部署 = y.部署, _
                     }) _
                    .Where(Function(x) CType(x.ID >= 30 And _
                                             x.年齢 >= 50), Boolean)) _
                    .OrderBy(Function(x) x.ID) _
                    .ThenBy(Function(x) x.年齢)

「Function(y) y.ID,」の箇所ですが、Ctrl + Spaceで予測変換しても正しく出てくれないので自分で手打ちしました。
その御蔭で結構な時間悩んでましたね(´・ω・`)

出力はいつもと同様ですね

For Each LoopData In JoinList
    GetListData = String.Empty
    GetListData = GetListData & clsString.SetSpace(CType(LoopData.ID, String), 5, clsString.emLR.Left) & " "
    GetListData = GetListData & clsString.SetSpace(LoopData.年齢, 3, clsString.emLR.Right) & " "
    GetListData = GetListData & clsString.SetSpace(CType(LoopData.名前, String), 20, clsString.emLR.Left) & " "
    GetListData = GetListData & clsString.SetSpace(CType(LoopData.部署, String), 10, clsString.emLR.Right)
    lstData.Items.Add(GetListData)
Next

なんだかんだで、使い方はわかってきたのですが本当にこれでいいのか!?って言う保証は無いです、、、

以上。

Whereで複数条件を指定した場合の記述(Linq To Entities )

今回は、Where区で複数条件を指定してデータを取得する方法です。

Dim con As New DB
Dim getdata as AAA () = con.AAA.Where(Function(x) x.ID = CType(txtID.Text, Integer) And _
                                               x.部署 = CType(txtBuCd.Text, Integer)).ToArray

ただし、Option Strictが「ON」の場合は上記の書き方だと波線が表示されコンパイルがうまくいかない。
f:id:daichi-t-0123:20160914103854p:plain

その場合は、下記のようにして対応した。
んー、微妙な感じですけど。。。。良い方法ないですかね。。。

Dim con As New DB
Dim getdata as AAA () = con.AAA.Where(Function(x) Ctype(x.ID = CType(txtID.Text, Integer) And _
                                       x.部署 = CType(txtBuCd.Text, Integer), Boolean)).ToArray

上記のデータを取り出したいときは下記のようにして取り出せます。

if getdata.Count > 0 then
   txtNm.text = getdata(0).名前
   txtAg.text = getdata(0).年齢
end if

※1件だけを出力したい時とかに使えると思います。

以上!