質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

LINQ to SQL

LINQ to SQLは.NET Framework 3.5のコンポーネントで、リレーショナル データをオブジェクトとして管理するためのランタイム インフラストラクチャを提供します。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

LINQ to Dataset

LINQ to Datasetは、ADO.NET のコンポーネントのひとつです。DataSetオブジェクトにキャッシュされたデータへのクエリを、よりシンプルかつ高速にします。クエリを記述する際、プログラミング言語そのものを使うことができるため、クエリ操作が簡単になるという利点があります。

解決済

至急お願いします。LINQ 複数テーブルjoinと複合条件とwhere

DENQ
DENQ

総合スコア19

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

LINQ to SQL

LINQ to SQLは.NET Framework 3.5のコンポーネントで、リレーショナル データをオブジェクトとして管理するためのランタイム インフラストラクチャを提供します。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

LINQ to Dataset

LINQ to Datasetは、ADO.NET のコンポーネントのひとつです。DataSetオブジェクトにキャッシュされたデータへのクエリを、よりシンプルかつ高速にします。クエリを記述する際、プログラミング言語そのものを使うことができるため、クエリ操作が簡単になるという利点があります。

4回答

0リアクション

0クリップ

12818閲覧

投稿2016/10/25 05:32

編集2016/10/25 07:08

###前提・実現したいこと
LINQで複数のテーブルをjoin
いくつかのテーブルはwhere句もつけたいです。
少し複雑ですが、作業が止まってしまっているため、ご教授よろしくお願いします。

###発生している問題・エラーメッセージ

join句のいずれかの式が正しくありません'GroupJoin'の呼び出しで肩を推論できませんでした。

というエラーが出ております。

###該当のソースコード

C#

Table1 [NoFlg], [RTth], [LTth] Table2 [ID], [START_DATE], [TOUROKU_NO], [BCD], [END_DATE] Table3 [ID], [DATE], [NO], [DSP_NO], [UR], [UL], [DR], [DL], [TOUROKU_1], [TOUROKU_2], [TOUROKU_3], [TOUROKU_4] table4 [TOUROKU_NO], [NAME_1], [NAME_2], [NAME_3], [NAME_4], [NAME_5], [NAME_6], [NAME_7], [NAME_8], table5 [TOUROKU_NO], [NAME_9], [NAME_10], [NAME_11], [NAME_12], [NAME_13], [NAME_14], [NAME_15], [NAME_16], var q = from em in Table3 join thUR in Table1 on em.UR equals thUR.RTth join thUL in Table1 on em.UL equals thUL.LTth join thDr in Table1 on em.DR equals thDr.RTth join thDl in Table1 on em.DL equals thDl.LTth join HK in table4 on em.TOUROKU_1 equals HK.TOUROKU_NO //この下のjoin句で対象のエラーが発生 join TB2 in Table2 on new { a = em.ID, b = HK.NAME_1} equals new { a = TB2.ID, b = TB2.TOUROKU_NO} into g where em.DATE >= g.START_DATE & em.DATE< g.END_DATE select new { em.ID, em.DATE, em.NO, em.DSP_NO, BI = (thUR.RTth == "0" ? "" : "R" + thUR.RTth) + (thUL.LTth == "0" ? "" : "L" + thUL.LTth) + (thDr.RTth == "0" ? "" : "r" + thDr.RTth) + (thDl.LTth == "0" ? "" : "l" + thDl.LTth), NAME_ID = (HK.NAME_1 == "0" ? "" : from c in g select c.BCD) }; SQLで書くとこうなります。 SELECT [ID], [DATE], [NO], [DSP_NO], (CASE v1.[RTth] WHEN '0' THEN '' ELSE 'R'+v1.[RTth] END) + (CASE v2.[LTth] WHEN '0' THEN '' ELSE 'L'+v2.[LTth] END) + (CASE v3.[RTth] WHEN '0' THEN '' ELSE 'r'+v3.[RTth] END) + (CASE v4.[LTth] WHEN '0' THEN '' ELSE 'l'+v4.[LTth] END) AS [BI], ISNULL((CASE c1.[NAME_1] WHEN '0' THEN '' ELSE b1.[BCD] END) + (CASE c1.[NAME_2] WHEN '0' THEN '' ELSE b2.[BCD] END) + (CASE c1.[NAME_3] WHEN '0' THEN '' ELSE b3.[BCD] END) + (CASE c1.[NAME_4] WHEN '0' THEN '' ELSE b4.[BCD] END) + (CASE c1.[NAME_5] WHEN '0' THEN '' ELSE b5.[BCD] END) + (CASE c1.[NAME_6] WHEN '0' THEN '' ELSE b6.[BCD] END) + (CASE c1.[NAME_7] WHEN '0' THEN '' ELSE b7.[BCD] END) + (CASE c1.[NAME_8] WHEN '0' THEN '' ELSE b8.[BCD] END) + (CASE c2.[NAME_9] WHEN '0' THEN '' ELSE b9.[BCD] END) + (CASE c2.[NAME_10] WHEN '0' THEN '' ELSE b10.[BCD] END) + (CASE c2.[NAME_11] WHEN '0' THEN '' ELSE b11.[BCD] END) + (CASE c2.[NAME_12] WHEN '0' THEN '' ELSE b12.[BCD] END) + (CASE c2.[NAME_13] WHEN '0' THEN '' ELSE b13.[BCD] END) + (CASE c2.[NAME_14] WHEN '0' THEN '' ELSE b14.[BCD] END) + (CASE c2.[NAME_15] WHEN '0' THEN '' ELSE b15.[BCD] END) + (CASE c2.[NAME_16] WHEN '0' THEN '' ELSE b16.[BCD] END) , '') AS [NAME_ID] FROM Table3 AS k1 LEFT JOIN Table1 AS v1 ON k1.[UR] = v1.[NoFlg] LEFT JOIN Table1 AS v2 ON k1.[UL] = v2.[NoFlg] LEFT JOIN Table1 AS v3 ON k1.[DR] = v3.[NoFlg] LEFT JOIN Table1 AS v4 ON k1.[DL] = v4.[NoFlg] LEFT JOIN table4 AS c1 ON k1.[TOUROKU_1] = c1.[TOUROKU_NO] LEFT JOIN Table2 AS b1 ON k1.[ID] = b1.[ID] AND c1.[NAME_1] = b1.[TOUROKU_NO] AND k1.[DATE] >= b1.[START_DATE] AND k1.[DATE] < b1.[END_DATE] LEFT JOIN Table2 AS b2 ON k1.[ID] = b2.[ID] AND c1.[NAME_2] = b2.[TOUROKU_NO] AND k1.[DATE] >= b2.[START_DATE] AND k1.[DATE] < b2.[END_DATE] LEFT JOIN Table2 AS b3 ON k1.[ID] = b3.[ID] AND c1.[NAME_3] = b3.[TOUROKU_NO] AND k1.[DATE] >= b3.[START_DATE] AND k1.[DATE] < b3.[END_DATE] LEFT JOIN Table2 AS b4 ON k1.[ID] = b4.[ID] AND c1.[NAME_4] = b4.[TOUROKU_NO] AND k1.[DATE] >= b4.[START_DATE] AND k1.[DATE] < b4.[END_DATE] LEFT JOIN Table2 AS b5 ON k1.[ID] = b5.[ID] AND c1.[NAME_5] = b5.[TOUROKU_NO] AND k1.[DATE] >= b5.[START_DATE] AND k1.[DATE] < b5.[END_DATE] LEFT JOIN Table2 AS b6 ON k1.[ID] = b6.[ID] AND c1.[NAME_6] = b6.[TOUROKU_NO] AND k1.[DATE] >= b6.[START_DATE] AND k1.[DATE] < b6.[END_DATE] LEFT JOIN Table2 AS b7 ON k1.[ID] = b7.[ID] AND c1.[NAME_7] = b7.[TOUROKU_NO] AND k1.[DATE] >= b7.[START_DATE] AND k1.[DATE] < b7.[END_DATE] LEFT JOIN Table2 AS b8 ON k1.[ID] = b8.[ID] AND c1.[NAME_8] = b8.[TOUROKU_NO] AND k1.[DATE] >= b8.[START_DATE] AND k1.[DATE] < b8.[END_DATE] LEFT JOIN table5 AS c2 ON k1.[TOUROKU_2] = c2.[TOUROKU_NO] LEFT JOIN Table2 AS b9 ON k1.[ID] = b9.[ID] AND c2.[NAME_9] = b9.[TOUROKU_NO] AND k1.[DATE] >= b9.[START_DATE] AND k1.[DATE] < b9.[END_DATE] LEFT JOIN Table2 AS b10 ON k1.[ID] = b10.[ID] AND c2.[NAME_10] = b10.[TOUROKU_NO] AND k1.[DATE] >= b10.[START_DATE] AND k1.[DATE] < b10.[END_DATE] LEFT JOIN Table2 AS b11 ON k1.[ID] = b11.[ID] AND c2.[NAME_11] = b11.[TOUROKU_NO] AND k1.[DATE] >= b11.[START_DATE] AND k1.[DATE] < b11.[END_DATE] LEFT JOIN Table2 AS b12 ON k1.[ID] = b12.[ID] AND c2.[NAME_12] = b12.[TOUROKU_NO] AND k1.[DATE] >= b12.[START_DATE] AND k1.[DATE] < b12.[END_DATE] LEFT JOIN Table2 AS b13 ON k1.[ID] = b13.[ID] AND c2.[NAME_13] = b13.[TOUROKU_NO] AND k1.[DATE] >= b13.[START_DATE] AND k1.[DATE] < b13.[END_DATE] LEFT JOIN Table2 AS b14 ON k1.[ID] = b14.[ID] AND c2.[NAME_14] = b14.[TOUROKU_NO] AND k1.[DATE] >= b14.[START_DATE] AND k1.[DATE] < b14.[END_DATE] LEFT JOIN Table2 AS b15 ON k1.[ID] = b15.[ID] AND c2.[NAME_15] = b15.[TOUROKU_NO] AND k1.[DATE] >= b15.[START_DATE] AND k1.[DATE] < b15.[END_DATE] LEFT JOIN Table2 AS b16 ON k1.[ID] = b16.[ID] AND c2.[NAME_16] = b16.[TOUROKU_NO] AND k1.[DATE] >= b16.[START_DATE] AND k1.[DATE] < b16.[END_DATE]

###試したこと
http://nyaffun.seesaa.net/category/12673984-1.html
こちらのサイトで紹介してある、二つのサイトを見ながらやりましたが、うまく行きませんでした。

最後のselect newの NAME_IDの三項演算子の部分でfrom c in g select c.BCDとしてますが、この式はビルドが通るか不安があります。
HK.NAME_1の値が0ならから文字それ以外ならtable2のBCDの値を取得したいです。

以上よろしくお願いします。

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
.net freamwork 3.5
C#

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

A.Ichi

2016/10/25 08:52

SQL文でのISNULLは多分typoミスですよね。JOINはできましたよ。
DENQ

2016/10/25 09:14

joinしたlinqの式を教えていただけないでしょうか?解答欄にお願いします。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

LINQ to SQL

LINQ to SQLは.NET Framework 3.5のコンポーネントで、リレーショナル データをオブジェクトとして管理するためのランタイム インフラストラクチャを提供します。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

LINQ to Dataset

LINQ to Datasetは、ADO.NET のコンポーネントのひとつです。DataSetオブジェクトにキャッシュされたデータへのクエリを、よりシンプルかつ高速にします。クエリを記述する際、プログラミング言語そのものを使うことができるため、クエリ操作が簡単になるという利点があります。