前提・実現したいこと
システムを実装するにあたって、データの紐付の設計を行いました。
しかし、どうしても設計通りにいかなくて困っています。
とくにSQLServerで引くことは可能であるのに、LINQtoSQLではうまくかけなかったりします。
私自身のC#の知識不足にも起因すると思いますが、調べてもどうしても行き詰ってしまったもので質問させてください。
発生している問題・エラーメッセージ
WHERE句でエラーが発生しています。
foreachが邪魔しているような気がしますが、なぜ以下のようなエラーになるのかがわかりません。
エラー 3 演算子 '>=' を 'string' と 'int' 型のオペランドに適用することはできません。
エラー 1 演算子 '&&' を 'bool' と 'ラムダ式' 型のオペランドに適用することはできません。
エラー 2 ローカルの変数 'SET_B' をこのスコープで宣言することはできません。これは、'親またはカレント' スコープで別の意味を持つ 'SET_B' の意味が変更されるのを避けるためです。
該当のソースコード
class Bind
{
private void Bind(string key)
{
/// アウトプット用のコレクションです。
LIST<OUT_PUT> output = new List<OUT_PUT>();
/// keyが複数指定されることもあるので、まずは1件(先頭)だけ取り出す設定にしてみました。
var key_id = (from a in HIS
where key = a.id1
select a.id1).FirstOrDefault();
/// 目標のid1を検索して、マスタに登録されているcodeと関連付けます。
var target = from b in HIS
join c in MST on b.code1 equals c.code
where key_id == b.id1
&& c.name == 'A'
select new
{
key_id,
A_id = b.id1,
A_no1 = b.no1,
B_no2 = b.no2,
B_id = b.id2
};
/// 1行ずつコレクションに追加していきたいため、foreachで繰り返します。
foreach (var SET_A in target)
{
/// 関連付け先のcodeのマスタがBであるかをチェックして、1件づつ紐づけます。
var SET_B = (from d in HIS
join e in MST on d.code1 equals e.code
where SET_A.B_id = d.id1
&& e.name == 'B'
select new
{
key_id,
SET_A.A_id,
SET_A.A_no1,
SET_A.B_no2,
SET_A.B_id,
B_no1 = d.no1,
C_no2 = d.no2,
C_id = d.id2,
}).FirstOrDefault();
/// さらに関連付けますが、この時にnoの条件によって、紐付対象が変わっていきます。
var SET_C = (from f in HIS
where (SET_B.B_no1 = f.id1
&& (int.Parse(SET_B.B_no2) >= 1 && int.Parse(SET_B.B_no2) <= 5
&& int.Parse(f.no1) >= 6 && int.Parse(f.no1) <= 10)
|| (int.Parse(SET_B.B_no2) >= 6 && int.Parse(SET_B.B_no2) <= 10
&& int.Parse(f.no1) >= 1 && int.Parse(f.no1) <= 5))
select new
{
key_id,
SET_B.A_id,
SET_B.A_no1,
SET_B.B_no2,
SET_B.B_id,
SET_B.B_no1,
SET_B.C_no2,
SET_B.C_id,
C_no1 = f.no1,
D_no2 = f.no2,
D_id = f.id2
}).DISTINCT();
/// 1配列づつoutput用のコレクションに追加していきます。
IF(SET_C != null);
{
out_put.AddRange(SET_C);
}
}
}
}
試したこと
LINQ での条件を絞り込み(WHERE句)を一通り調べてみましたがわかりませんでした(参考書では問題なかったです)。
また、in ['1'-'5']のような範囲選択も使えませんでした。
補足情報(言語/FW/ツール等のバージョンなど)
C# ASP.NET MVC Framework、VisualStadio2013、SQLServer2014
質問者のC#のプログラミング能力はあまり高くはありません。
著:高橋麻奈のやさしいC#を一通り読みましたが、オブジェクト指向がいまいちまだふんわりした感じです。
必要なテーブル(HIS、MST)と、出力目標の(OUTPUT)のExcelを以下にアップロードしました。
HIS-MST-OUTPUT
よろしくお願いいたします。
※エラーは一通り修正したものを掲載してあります。修正前をご覧になりたい方は、質問編集履歴を確認してください。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
「⇒」が付いている行の部分に関してとりあえず2点確認させてください。
B_no2
のデータ型がstring
になっていませんか?
string
とint
を比較演算子>=
を使用して比較することは出来ません。f.no1 => 6
及びf.no1 => 1
の部分はそれぞれ、
f.no1 >= 6
及びf.no1 >= 1
と書くべきではありませんか?
=>
はラムダ式にて使用されるラムダ演算子です。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.34%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
TAKA_0921
2016/05/21 02:59
記載されたソースコードはVisual Studio等で記述したものと同一でしょうか?
「LIST」や「where key = a.id1」や「})DISTINCT();」など、
何となくやりたいことは伝わってきますがC#の書き方ではないように感じますし、
発生している問題の再現性を高めるためにも同一のソースコードを掲載された方が
回答しやすくなると思います。
DinKa
2016/05/21 03:10
はい、確かに同一ではないです。
VisualStudioで記述したものをそのまま掲載すると、問題がわかりにくくなると思ったので、自分で設計したSQL抽出内容を元にC#風に作り替えました。
やはり、遠回りでも質問用の環境を構築したほうが良いのでしょうか。
TAKA_0921
2016/05/21 03:38 編集
環境を作り直す必要はないと思いますが、ソースコードを見た限りではビルドの時点で質問に記述されたこと以上の量のエラーが表示されると思われます。文字の大小や括弧の数、"."の抜け等問題の箇所以外は正常な記述にするか、あるいはコンパイルエラーを解決するだけであれば該当箇所のソースコードのみでも問題ないのではと思いました。
DinKa
2016/05/21 03:42
確かに今見てみるとかなりミスがあるようです。
その部分だけでも環境に乗せて修正して再アップしてみます。