LINQのjoinを条件で分岐できるでしょうか?

タグの編集
投稿者 メタルスライム  (社会人) 投稿日時 2017/9/20 21:14:23
前回「複数のデータテーブルやコレクションのデータを~」という質問をさせていただいた、メタルスライムと申します。

いくつかのデータテーブルあるいはコレクションを、Joinで結合して、データを取得したいと考えています。

その際、フラグ等の条件で結合を分岐したいのですが、上手くいきません。
以下に、コードを記載しています。
皆様のお知恵を拝借したく、お手数ですが、宜しくお願い致します。

◆サンプル◆
例えばLIST_AとLIST_Bというリストで、
Dim Query = From A In LIST_A
              Join B In LIST_B On A.ID Equals B.ID
とJOINします。

ここでもしフラグCがtrueの場合、さらにjoinを、falseの場合
Joinせず、次の処理へ。
次に、今度はフラグDがtrueの場合、さらにjoinを、falseの場合
Joinせず、次の処理へ…。
(こういう処理が10回くらい必要です)

このような処理を
Dim Query = From A In LIST_A
              Join B In LIST_B On A.ID Equals B.ID
If FlagC﹦true then
Join C In LIST_C On A.ID Equals C.ID
End If 
と書いてみましたが、ダメでした。

仕方ないので、今は
Dim Query = From A In LIST_A
              Join B In LIST_B On A.ID Equals B.ID
として、
その後、
If FlagC﹦true then
Dim Query2 = From q In Query 
              Join C In LIST_C On q.ID Equals C.ID
End If 
としています。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2017/9/21 10:45:48
> いくつかのデータテーブルあるいはコレクションを、Joinで結合して、データを取得したいと考えています。

LINQ 操作において、Where や Order By は、列挙データの
順番や件数を変化させますが、データ型そのものは変化しません。

しかし Join 操作や Select は、LINQ 結果のデータ型まで異なってくるはずです。
列挙した結果は、最終的にどのように取り出して利用したいのでしょうか?


具体例が無いのでイメージが沸かないのですが、ひとまず、
SQL でいうところの「INNER JOIN」ではなく、「OUTER JOIN」の意味でよいのなら、
ひとまずすべての条件で繋いでおき、列挙時に FlagC を確認するという手もあります。
http://windyrings.jugem.jp/?eid=836
https://ameblo.jp/komasu/entry-10930942751.html
http://qiita.com/taiga_takahari/items/a5d4cdb74661253704f0


> If FlagC﹦true then
>  Dim Query2 = From q In Query 
>    Join C In LIST_C On q.ID Equals C.ID
> End If 
> としています。 

等価演算子の等号が
 "="  ChrW(&H003D) 'EQUALS SIGN'
 "=" ChrW(&HFF1D) 'FULLWIDTH EQUALS SIGN'
ではなく、
 "﹦" ChrW(&HFE66) 'SMALL EQUALS SIGN'
になってしまっていますよ。


それはさておき、提示頂いたコードですと、End If を抜けた後では、
Query2 変数にアクセスすることができなくなってしまいます。

また、最初の Query では Select 句が省略されていますから、
「Join C In LIST_C On q.ID Equals C.ID」のように書くこともできないはずです。

「Join C In LIST_C On q.A.ID Equals C.ID」もしくは
「Join C In LIST_C On q.B.ID Equals C.ID」ではありませんか?


(案1) If FlagC Then の外側で Dim Query2 As IEnumerable(Of 型) を宣言して使う。
 ※この場合、匿名型は使えません。

(案2) 先に紹介した URL のように、外部結合相当の問い合わせにしてしまう。

(案3) LINQ ではなく、DataSet の DataRelation 、Expression Column による集計を用いる。
https://msdn.microsoft.com/ja-jp/library/dbwcse3d.aspx
投稿者 メタルスライム  (社会人) 投稿日時 2017/9/24 20:55:39
魔界の仮面弁士さま

ご回答いただきありがとうございました。

とりあえず、IF文で分岐していた処理をせずに、
全てのテーブルをJOINすることで対応しました。

ご提案いただいた回答とは違いますが、解決(?)しましたので
解決の状態とします。