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

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

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

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

LINQ to SQL

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

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

Q&A

解決済

1回答

8390閲覧

LINQtoSQLでのWHEREのエラーについて

DinKa

総合スコア40

C#

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

LINQ to SQL

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

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

0グッド

1クリップ

投稿2016/05/20 08:39

編集2016/05/23 01:06

###前提・実現したいこと
システムを実装するにあたって、データの紐付の設計を行いました。
しかし、どうしても設計通りにいかなくて困っています。
とくに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
よろしくお願いいたします。

※エラーは一通り修正したものを掲載してあります。修正前をご覧になりたい方は、質問編集履歴を確認してください。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TAKA_0921

2016/05/20 17:59

記載されたソースコードはVisual Studio等で記述したものと同一でしょうか? 「LIST」や「where key = a.id1」や「})DISTINCT();」など、 何となくやりたいことは伝わってきますがC#の書き方ではないように感じますし、 発生している問題の再現性を高めるためにも同一のソースコードを掲載された方が 回答しやすくなると思います。
DinKa

2016/05/20 18:10

はい、確かに同一ではないです。 VisualStudioで記述したものをそのまま掲載すると、問題がわかりにくくなると思ったので、自分で設計したSQL抽出内容を元にC#風に作り替えました。 やはり、遠回りでも質問用の環境を構築したほうが良いのでしょうか。
TAKA_0921

2016/05/20 18:44 編集

環境を作り直す必要はないと思いますが、ソースコードを見た限りではビルドの時点で質問に記述されたこと以上の量のエラーが表示されると思われます。文字の大小や括弧の数、"."の抜け等問題の箇所以外は正常な記述にするか、あるいはコンパイルエラーを解決するだけであれば該当箇所のソースコードのみでも問題ないのではと思いました。
DinKa

2016/05/20 18:42

確かに今見てみるとかなりミスがあるようです。 その部分だけでも環境に乗せて修正して再アップしてみます。
guest

回答1

0

ベストアンサー

「⇒」が付いている行の部分に関してとりあえず2点確認させてください。

  1. B_no2のデータ型がstringになっていませんか?

stringintを比較演算子>=を使用して比較することは出来ません。

  1. f.no1 => 6及びf.no1 => 1の部分はそれぞれ、

f.no1 >= 6及びf.no1 >= 1と書くべきではありませんか?
=>はラムダ式にて使用されるラムダ演算子です。

投稿2016/05/20 17:46

TAKA_0921

総合スコア234

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DinKa

2016/05/20 17:59

深夜に回答ありがとうございます。 はい、確かにstringです、数値もすべてString型で登録されています。 intでキャストしようとしたらエラーになりました、当然でしょうけど。 また、評価数字を’1’としてもダメでした。 =>は自動でラムダ式のラムダ演算子になるのですね、ラムダ式では確かそういう作法があることを知っていましたが、SQL式の途中に出現しても認識されてしまうのですね。ラムダ式を使ったことがないのもありますが、今まで知りませんでした。 >=の部分は、=>に修正してみます。
DinKa

2016/05/23 00:36

大変遅くなりましたが、=>については、>=に修正したところ該当項目に関してエラーがなくなりました。 また、修正済みの該当ソースコードを掲載させていただきましたが、 LIST<OUT_PUT>、MST、HISに関しては該当データベースやコンストラクタの定義がないのでエラーは出てしまっていますが、それ以外はエラーは出なくなりました。 問題は、実際に構築しているほうの環境ではやはり>=の演算子でエラーが出てしまいます。 エラー 1 演算子 '>=' を 'string' と 'char' 型のオペランドに適用することはできません。 エラー 2 演算子 '>=' を 'string' と 'char' 型のオペランドに適用することはできません。
ozwk

2016/05/23 00:44

「"1"」と「'1'」はC#では異なる型です 前者はstring,後者はcharです。 文字列からParse()して数値として比較したほうがいいと思います。
DinKa

2016/05/23 00:50

ありがとうございます、SQLServerで弄ってばかりいたので、そのままにしてしまいました。 修正したところ、エラー 1 演算子 '>=' を 'string' と 'string' 型のオペランドに適用することはできません。 と出ましたので、これを数値型にキャストすればいいのでしょうか?
DinKa

2016/05/23 01:02 編集

int.Parse()で要素をint型に変換したところ、エラーがなくなりました。 初歩的なところを教えていただいてありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問