###前提・実現したいこと
システムを実装するにあたって、データの紐付の設計を行いました。
しかし、どうしても設計通りにいかなくて困っています。
とくにSQLServerで引くことは可能であるのに、LINQtoSQLではうまくかけなかったりします。
私自身のC#の知識不足にも起因すると思いますが、調べてもどうしても行き詰ってしまったもので質問させてください。
###発生している問題・エラーメッセージ
WHERE句でエラーが発生しています。
foreachが邪魔しているような気がしますが、なぜ以下のようなエラーになるのかがわかりません。
エラー 3 演算子 '>=' を 'string' と 'int' 型のオペランドに適用することはできません。 エラー 1 演算子 '&&' を 'bool' と 'ラムダ式' 型のオペランドに適用することはできません。 エラー 2 ローカルの変数 'SET_B' をこのスコープで宣言することはできません。これは、'親またはカレント' スコープで別の意味を持つ 'SET_B' の意味が変更されるのを避けるためです。
###該当のソースコード
C#
1class Bind 2{ 3 4 private void Bind(string key) 5 { 6 /// アウトプット用のコレクションです。 7 LIST<OUT_PUT> output = new List<OUT_PUT>(); 8 /// keyが複数指定されることもあるので、まずは1件(先頭)だけ取り出す設定にしてみました。 9 var key_id = (from a in HIS 10 where key = a.id1 11 select a.id1).FirstOrDefault(); 12 /// 目標のid1を検索して、マスタに登録されているcodeと関連付けます。 13 var target = from b in HIS 14 join c in MST on b.code1 equals c.code 15 where key_id == b.id1 16 && c.name == 'A' 17 select new 18 { 19 key_id, 20 A_id = b.id1, 21 A_no1 = b.no1, 22 B_no2 = b.no2, 23 B_id = b.id2 24 }; 25 /// 1行ずつコレクションに追加していきたいため、foreachで繰り返します。 26 foreach (var SET_A in target) 27 { 28 /// 関連付け先のcodeのマスタがBであるかをチェックして、1件づつ紐づけます。 29 var SET_B = (from d in HIS 30 join e in MST on d.code1 equals e.code 31 where SET_A.B_id = d.id1 32 && e.name == 'B' 33 select new 34 { 35 key_id, 36 SET_A.A_id, 37 SET_A.A_no1, 38 SET_A.B_no2, 39 SET_A.B_id, 40 B_no1 = d.no1, 41 C_no2 = d.no2, 42 C_id = d.id2, 43 }).FirstOrDefault(); 44 45 /// さらに関連付けますが、この時にnoの条件によって、紐付対象が変わっていきます。 46 var SET_C = (from f in HIS 47 where (SET_B.B_no1 = f.id1 48 && (int.Parse(SET_B.B_no2) >= 1 && int.Parse(SET_B.B_no2) <= 5 49 && int.Parse(f.no1) >= 6 && int.Parse(f.no1) <= 10) 50 || (int.Parse(SET_B.B_no2) >= 6 && int.Parse(SET_B.B_no2) <= 10 51 && int.Parse(f.no1) >= 1 && int.Parse(f.no1) <= 5)) 52 select new 53 { 54 key_id, 55 SET_B.A_id, 56 SET_B.A_no1, 57 SET_B.B_no2, 58 SET_B.B_id, 59 SET_B.B_no1, 60 SET_B.C_no2, 61 SET_B.C_id, 62 C_no1 = f.no1, 63 D_no2 = f.no2, 64 D_id = f.id2 65 }).DISTINCT(); 66 67 /// 1配列づつoutput用のコレクションに追加していきます。 68 IF(SET_C != null); 69 { 70 out_put.AddRange(SET_C); 71 } 72 } 73 } 74} 75 76
###試したこと
LINQ での条件を絞り込み(WHERE句)を一通り調べてみましたがわかりませんでした(参考書では問題なかったです)。
また、in ['1'-'5']のような範囲選択も使えませんでした。
###補足情報(言語/FW/ツール等のバージョンなど)
C# ASP.NET MVC Framework、VisualStadio2013、SQLServer2014
質問者のC#のプログラミング能力はあまり高くはありません。
著:高橋麻奈のやさしいC#を一通り読みましたが、オブジェクト指向がいまいちまだふんわりした感じです。
必要なテーブル(HIS、MST)と、出力目標の(OUTPUT)のExcelを以下にアップロードしました。
HIS-MST-OUTPUT
よろしくお願いいたします。
※エラーは一通り修正したものを掲載してあります。修正前をご覧になりたい方は、質問編集履歴を確認してください。
回答1件
あなたの回答
tips
プレビュー