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

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

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

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

LINQ

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

Visual Studio 2013

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

ASP.NET MVC Framework

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

Q&A

解決済

2回答

13540閲覧

型変換に関するエラーについて

DinKa

総合スコア40

C#

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

LINQ

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

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/25 05:10

編集2016/05/26 01:45

###前提・実現したいこと
前回のシステムを引き続き作成中です。
前回の反省点を踏まえて、できるだけ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 ディレクティブまたはアセンブリ参照が不足しています。

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

C#

1using System.Windows.Forms; 2using System.Drawing; 3using System; 4using System.Collections.Generic; 5using System.Linq; 6 7 8public partial class OUT_PUT 9{ 10 public string key_id { get; set; } 11 public string A_id { get; set; } 12 public string A_no1 { get; set; } 13 public string B_no2 { get; set; } 14 public string B_id { get; set; } 15 public string B_no1 { get; set; } 16 public string C_no2 { get; set; } 17 public string C_id { get; set; } 18 public string C_no1 { get; set; } 19 public string D_no2 { get; set; } 20 public string D_id { get; set; } 21} 22 23public partial class HIS 24{ 25 public string id1 { get; set; } 26 public string no1 { get; set; } 27 public string code1 { get; set; } 28 public string id2 { get; set; } 29 public string no2 { get; set; } 30 public string code2 { get; set; } 31 32} 33 34public partial class MST 35{ 36 public string code { get; set; } 37 public string name { get; set; } 38} 39 40public class A 41{ 42 public static List<OUT_PUT> AAA(string key) 43 { 44 List<HIS> HIS = new List<HIS> { 45 new HIS { id1 = "AA01", no1 = "1", code1 = "AA", id2 = "BB01", no2 = "1", code2 = "BB"}, 46 new HIS { id1 = "AA01", no1 = "2", code1 = "AA", id2 = "BB01", no2 = "2", code2 = "BB"}, 47 new HIS { id1 = "AA01", no1 = "3", code1 = "AA", id2 = "BB01", no2 = "3", code2 = "BB"}, 48 new HIS { id1 = "BB01", no1 = "1", code1 = "BB", id2 = "CC01", no2 = "1", code2 = "CC"}, 49 new HIS { id1 = "BX01", no1 = "1", code1 = "BX", id2 = "CC02", no2 = "1", code2 = "CC"}, 50 new HIS { id1 = "CC01", no1 = "1", code1 = "CC", id2 = "DD01", no2 = "1", code2 = "DD"}, 51 new HIS { id1 = "CC01", no1 = "2", code1 = "CC", id2 = "DD01", no2 = "2", code2 = "DD"}, 52 new HIS { id1 = "CC01", no1 = "3", code1 = "CC", id2 = "DD01", no2 = "3", code2 = "DD"}, 53 new HIS { id1 = "CC01", no1 = "4", code1 = "CC", id2 = "DD01", no2 = "4", code2 = "DD"}, 54 new HIS { id1 = "CC01", no1 = "5", code1 = "CC", id2 = "DD01", no2 = "5", code2 = "DD"}, 55 new HIS { id1 = "CC01", no1 = "6", code1 = "CC", id2 = "DD02", no2 = "1", code2 = "DD"}, 56 new HIS { id1 = "CC01", no1 = "7", code1 = "CC", id2 = "DD02", no2 = "2", code2 = "DD"}, 57 new HIS { id1 = "CC01", no1 = "8", code1 = "CC", id2 = "DD02", no2 = "3", code2 = "DD"}, 58 new HIS { id1 = "CC01", no1 = "9", code1 = "CC", id2 = "DD02", no2 = "4", code2 = "DD"}, 59 new HIS { id1 = "CC01", no1 = "10", code1 = "CC", id2 = "DD02", no2 = "5", code2 = "DD"} 60 }; 61 62 List<MST> MST = new List<MST> { 63 new MST { code = "AA", name = "A"}, 64 new MST { code = "BB", name = "B"}, 65 new MST { code = "BX", name = "B"}, 66 new MST { code = "CC", name = "C"}, 67 new MST { code = "DD", name = "D"} 68 }; 69 70 71 /// アウトプット用のコレクションです。 72 List<OUT_PUT> output = new List<OUT_PUT>(); 73 List<OUT_PUT> SET_C = new List<OUT_PUT>(); 74 List<OUT_PUT> result = new List<OUT_PUT>(); 75 /// keyが複数指定されることもあるので、まずは1件(先頭)だけ取り出す設定にしてみました。 76 var key_id = (from a in HIS 77 where key == a.id1 78 select a.id1).FirstOrDefault(); 79 /// 目標のid1を検索して、マスタに登録されているcodeと関連付けます。 80 var target = from b in HIS 81 join c in MST on b.code1 equals c.code 82 where key_id == b.id1 83 && c.name == "A" 84 select new 85 { 86 key_id, 87 A_id = b.id1, 88 A_no1 = b.no1, 89 B_no2 = b.no2, 90 B_id = b.id2 91 }; 92 /// 1行ずつコレクションに追加していきたいため、foreachで繰り返します。 93 foreach (var SET_A in target) 94 { 95 /// 関連付け先のcodeのマスタがBであるかをチェックして、1件づつ紐づけます。 96 var SET_B = (from d in HIS 97 join e in MST on d.code1 equals e.code 98 where SET_A.B_id == d.id1 99 && e.name == "B" 100 select new 101 { 102 key_id, 103 SET_A.A_id, 104 SET_A.A_no1, 105 SET_A.B_no2, 106 SET_A.B_id, 107 B_no1 = d.no1, 108 C_no2 = d.no2, 109 C_id = d.id2, 110 }).FirstOrDefault(); 111 112 /// さらに関連付けますが、この時にnoの条件によって、紐付対象が変わっていきます。 113 SET_C = (from f in HIS 114 where (SET_B.B_no1 == f.id1 115 && (int.Parse(SET_B.B_no2) >= 1 && int.Parse(SET_B.B_no2) <= 5 116 && int.Parse(f.no1) >= 6 && int.Parse(f.no1) <= 10) 117 || (int.Parse(SET_B.B_no2) >= 6 && int.Parse(SET_B.B_no2) <= 10 118 && int.Parse(f.no1) >= 1 && int.Parse(f.no1) <= 5)) 119 select new OUT_PUT() //旧エラー1 120 { 121 key_id = key_id, 122 A_id = SET_B.A_id, 123 A_no1 = SET_B.A_no1, 124 B_no2 = SET_B.B_no2, 125 B_id = SET_B.B_id, 126 B_no1 = SET_B.B_no1, 127 C_no2 = SET_B.C_no2, 128 C_id =SET_B.C_id, 129 C_no1 = f.no1, 130 D_no2 = f.no2, 131 D_id = f.id2 132 }).ToList(); 133 134 /// 1配列づつoutput用のコレクションに追加していきます。 135 if(SET_C != null) 136 { 137 output.AddRange(SET_C); 138 result = output; 139 } 140 } 141 return result; 142 143 } 144 145} 146 147public class B 148{ 149 public static void Main() 150 { 151 Form form = new Form(); 152 form.Text = "AA01"; 153 form.Width = 1000; form.Height = 600; 154 155 Label lb = new Label(); 156 157 A cA = new A(); 158 lb.Text = A.AAA(form.Text).ToString(); 159 lb.Parent = form; 160 Application.Run(form); 161 } 162}

###試したこと
エラー1は、SET_Cを型変換しようと試みましたが、うまくいきませんでした。
また、そもそもそのエラーがなぜ発生するのかが理解できていません。
エラー2は、エラー内容自体がそもそも理解できませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)
C# VisualStudio2013 ASP.NET MVC LINQ to SQL

オブジェクト指向がまだ不慣れなので、読みづらいかもしれません。
前回のやり取りも、もしかしたら参考になるかもしれません。

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

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

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

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

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

ozwk

2016/05/25 06:47

どのエラーがどの行で出ているか教えて下さい
DinKa

2016/05/25 07:09 編集

失礼しました。ソースにも書きましたが、 エラー1はselectでエラーが出ています。 エラー2はA.AAA(form.Text)でエラーが出ています。
guest

回答2

0

  • エラー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>
ですので型が違う為によるエラーです。

投稿2016/05/25 07:21

編集2016/05/25 07:26
aglkjggg

総合スコア769

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

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

DinKa

2016/05/25 08:05

回答ありがとうございます。 >エラー1 エラー1に関しては、修正していただいた内容に加えて、SET_Cを.ToList()で変換することでエラーはなくなりました。 >エラー2 どう型をそろえてやればいいのかはまだ確認中です。ありがとうございました。
guest

0

ベストアンサー

エラー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>型を返します。


修正中コードについて、

一旦落ち着いてください。

ラベルのテキストとして表示したい内容は何ですか?

決めてないなら今決めてください。
これを明確にしてからコードを書かないといつまでたっても混乱したままです。

その上で、

  1. A.AAA(...)は何ですか?
  2. 1と表示したい内容はどういう関係ですか?

を考えてください。

投稿2016/05/25 07:16

編集2016/05/25 08:22
ozwk

総合スコア13521

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

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

DinKa

2016/05/25 07:35

お早い回答ありがとうございます。 >エラー1 なるほど、selectの先に合わせたつもりでしたが、その直前ではIEnumerable< ??? >の状態なのですね。 型変換のメソッドは調べてみます。 ???の中身はコンパイルしたときのAnonymousType'1型になるのですか、全く使ったことがなかったので、理解できていませんでした。 >エラー2 なんでvoid型になるのだろうと思ってました。ありがとうございます。
ozwk

2016/05/25 07:42

> エラー2 いやなんでvoidなのかはわからないんですが、 とりあえず提示のコードで変なところといえばそこです。 なので他にも原因あるかもしれません。
DinKa

2016/05/25 08:08

>エラー2 調整していましたら、エラー内容がいつの間にか変わってました。 最新の状態で、またソースをアップロードしてみます。
DinKa

2016/05/26 00:02 編集

>修正中のコードについて 新しく表示されたエラーについてもエラーは治りました。 ラベルに表示したい項目は、ClassAでの抽出結果である、SET_Cを集めたコレクションoutputです。 >1.A.AAA(...)はソートキーのつもりです。 >2.検索キーをもとに、ClassAのソートを行おうと思っています。 ラベルにへの表示結果は、 System.Collection s.Generic.List'1[O と出力されました、こちらは自分でも調べてみます。
DinKa

2016/05/26 02:17

一旦クローズしてしまったので、もう別なスレッドを立てたほうがよいのかもしれませんが、流れ的にこちらで経過報告をしていきたいと思います。 実際にSQLserverのデータを使用してみたところ、実行時に別なエラーが発生しました。 エラーとしては、 メソッド 'Int32 Parse(System.String)' は LINQ to Entities では認識されないため、ストア式に変換できません。] というSQL文に変換できないというエラーだと思います。 おそらく何かしら解決するための手段はあると思うので、探してみます。
DinKa

2016/05/27 00:44 編集

上記エラーはLINQ to Entitiesではなく、LINQ to Objectにすれば回避できそうですが、まだそのあたりも理解できていないため、もうしばらくかかりそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問