LINQのjoinを条件で分岐できるでしょうか?
投稿者 魔界の仮面弁士  (社会人)
投稿日時
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
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することで対応しました。
ご提案いただいた回答とは違いますが、解決(?)しましたので
解決の状態とします。
ご回答いただきありがとうございました。
とりあえず、IF文で分岐していた処理をせずに、
全てのテーブルをJOINすることで対応しました。
ご提案いただいた回答とは違いますが、解決(?)しましたので
解決の状態とします。
いくつかのデータテーブルあるいはコレクションを、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
としています。