前提・実現したいこと
前回のシステムを引き続き作成中です。
前回の反省点を踏まえて、できるだけVS内で完結するようにしてみました。
最終的にはExcel帳票出力をしたいのですが、第一段階として、コンソールやフォームに出してみようと考えています。
その中で型変換関係でのエラーについて、教えていただければと思います。
発生している問題・エラーメッセージ
クラスA、Bともに型でのエラーが出ています。
//エラー 2 型 'void' を型 'string' に暗黙的に変換できません。
//エラー 1 型 'System.Collections.Generic.IEnumerable<AnonymousType#1>' を 'System.Collections.Generic.List<OUT_PUT>' に暗黙的に変換できません。明示的な変換が存在します。(cast が不足していないかどうかを確認してください)
エラー 1 'System.Collections.Generic.List<OUT_PUT>' に 'key_id' の定義が含まれておらず、型 'System.Collections.Generic.List<OUT_PUT>' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。
該当のソースコード
using System.Windows.Forms;
using System.Drawing;
using System;
using System.Collections.Generic;
using System.Linq;
public partial class OUT_PUT
{
public string key_id { get; set; }
public string A_id { get; set; }
public string A_no1 { get; set; }
public string B_no2 { get; set; }
public string B_id { get; set; }
public string B_no1 { get; set; }
public string C_no2 { get; set; }
public string C_id { get; set; }
public string C_no1 { get; set; }
public string D_no2 { get; set; }
public string D_id { get; set; }
}
public partial class HIS
{
public string id1 { get; set; }
public string no1 { get; set; }
public string code1 { get; set; }
public string id2 { get; set; }
public string no2 { get; set; }
public string code2 { get; set; }
}
public partial class MST
{
public string code { get; set; }
public string name { get; set; }
}
public class A
{
public static List<OUT_PUT> AAA(string key)
{
List<HIS> HIS = new List<HIS> {
new HIS { id1 = "AA01", no1 = "1", code1 = "AA", id2 = "BB01", no2 = "1", code2 = "BB"},
new HIS { id1 = "AA01", no1 = "2", code1 = "AA", id2 = "BB01", no2 = "2", code2 = "BB"},
new HIS { id1 = "AA01", no1 = "3", code1 = "AA", id2 = "BB01", no2 = "3", code2 = "BB"},
new HIS { id1 = "BB01", no1 = "1", code1 = "BB", id2 = "CC01", no2 = "1", code2 = "CC"},
new HIS { id1 = "BX01", no1 = "1", code1 = "BX", id2 = "CC02", no2 = "1", code2 = "CC"},
new HIS { id1 = "CC01", no1 = "1", code1 = "CC", id2 = "DD01", no2 = "1", code2 = "DD"},
new HIS { id1 = "CC01", no1 = "2", code1 = "CC", id2 = "DD01", no2 = "2", code2 = "DD"},
new HIS { id1 = "CC01", no1 = "3", code1 = "CC", id2 = "DD01", no2 = "3", code2 = "DD"},
new HIS { id1 = "CC01", no1 = "4", code1 = "CC", id2 = "DD01", no2 = "4", code2 = "DD"},
new HIS { id1 = "CC01", no1 = "5", code1 = "CC", id2 = "DD01", no2 = "5", code2 = "DD"},
new HIS { id1 = "CC01", no1 = "6", code1 = "CC", id2 = "DD02", no2 = "1", code2 = "DD"},
new HIS { id1 = "CC01", no1 = "7", code1 = "CC", id2 = "DD02", no2 = "2", code2 = "DD"},
new HIS { id1 = "CC01", no1 = "8", code1 = "CC", id2 = "DD02", no2 = "3", code2 = "DD"},
new HIS { id1 = "CC01", no1 = "9", code1 = "CC", id2 = "DD02", no2 = "4", code2 = "DD"},
new HIS { id1 = "CC01", no1 = "10", code1 = "CC", id2 = "DD02", no2 = "5", code2 = "DD"}
};
List<MST> MST = new List<MST> {
new MST { code = "AA", name = "A"},
new MST { code = "BB", name = "B"},
new MST { code = "BX", name = "B"},
new MST { code = "CC", name = "C"},
new MST { code = "DD", name = "D"}
};
/// アウトプット用のコレクションです。
List<OUT_PUT> output = new List<OUT_PUT>();
List<OUT_PUT> SET_C = new List<OUT_PUT>();
List<OUT_PUT> result = 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の条件によって、紐付対象が変わっていきます。
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 OUT_PUT() //旧エラー1
{
key_id = key_id,
A_id = SET_B.A_id,
A_no1 = SET_B.A_no1,
B_no2 = SET_B.B_no2,
B_id = SET_B.B_id,
B_no1 = SET_B.B_no1,
C_no2 = SET_B.C_no2,
C_id =SET_B.C_id,
C_no1 = f.no1,
D_no2 = f.no2,
D_id = f.id2
}).ToList();
/// 1配列づつoutput用のコレクションに追加していきます。
if(SET_C != null)
{
output.AddRange(SET_C);
result = output;
}
}
return result;
}
}
public class B
{
public static void Main()
{
Form form = new Form();
form.Text = "AA01";
form.Width = 1000; form.Height = 600;
Label lb = new Label();
A cA = new A();
lb.Text = A.AAA(form.Text).ToString();
lb.Parent = form;
Application.Run(form);
}
}
試したこと
エラー1は、SET_Cを型変換しようと試みましたが、うまくいきませんでした。
また、そもそもそのエラーがなぜ発生するのかが理解できていません。
エラー2は、エラー内容自体がそもそも理解できませんでした。
補足情報(言語/FW/ツール等のバージョンなど)
C# VisualStudio2013 ASP.NET MVC LINQ to SQL
オブジェクト指向がまだ不慣れなので、読みづらいかもしれません。
前回のやり取りも、もしかしたら参考になるかもしれません。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
エラー1が出ている代入文:SET_C = from f in HIS ...
についてです
左辺(SET_C)の型はList<OUT_PUT>です。
右辺の型は、まず最終的にselectで終わるのでIEnumerable< ??? >です。
この時点で既に型が違っています。
IEnumerable<T>からList<T>に変換する拡張メソッドがあるのでそれを使ってください。
つぎに右辺の型IEnumerable< ??? >の中身???はどんな型か考えます。
new{ ~~~ }
と匿名型を宣言しています
よって???はコンパイラが自動生成するAnonymousType`1型になります。
これはOUT_PUTと何の関係もない型です。
select句で直接OUT_PUT型を生成してください。
エラー2ですが、
とりあえずLabel.Textはstringで
A.AAA(...)はList<OUT_PUT>型を返します。
修正中コードについて、
一旦落ち着いてください。
ラベルのテキストとして表示したい内容は何ですか?
決めてないなら今決めてください。
これを明確にしてからコードを書かないといつまでたっても混乱したままです。
その上で、
- A.AAA(...)は何ですか?
- 1と表示したい内容はどういう関係ですか?
を考えてください。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
- エラー1について
単純にselect new
を行った場合は暗黙的な型(Anonymous Type)が付けられます。
よって、OUT_PUT
と同じ型のようにみえたselect部分も、内部的には違った型となっています。
厳密にはselect new 型
としてやる必要があります。
select new
{
key_id,
SET_B.A_id,
...
}
↓
select new OUT_PUT()
{
key_id = key_id,
A_id= SET_B.A_id,
A_no1 = SET_B.A_no1,
...
}
- エラー2について
lb.Text
の型はstring
A.AAA(form.Text)
の型はList<OUT_PUT>
ですので型が違う為によるエラーです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.32%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
ozwk
2016/05/25 15:47
どのエラーがどの行で出ているか教えて下さい
DinKa
2016/05/25 15:57 編集
失礼しました。ソースにも書きましたが、
エラー1はselectでエラーが出ています。
エラー2はA.AAA(form.Text)でエラーが出ています。