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

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

ただいまの
回答率

88.32%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 7,352

DinKa

score 39

前提・実現したいこと

前回のシステムを引き続き作成中です。
前回の反省点を踏まえて、できるだけ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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ozwk

    2016/05/25 15:47

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

    キャンセル

  • DinKa

    2016/05/25 15:57 編集

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

    キャンセル

回答 2

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


修正中コードについて、

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

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

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

その上で、

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

を考えてください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/26 08:53 編集

    >修正中のコードについて
    新しく表示されたエラーについてもエラーは治りました。
    ラベルに表示したい項目は、ClassAでの抽出結果である、SET_Cを集めたコレクションoutputです。

    >1.A.AAA(...)はソートキーのつもりです。
    >2.検索キーをもとに、ClassAのソートを行おうと思っています。
    ラベルにへの表示結果は、
    System.Collection
    s.Generic.List'1[O
    と出力されました、こちらは自分でも調べてみます。

    キャンセル

  • 2016/05/26 11:17

    一旦クローズしてしまったので、もう別なスレッドを立てたほうがよいのかもしれませんが、流れ的にこちらで経過報告をしていきたいと思います。

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

    キャンセル

  • 2016/05/27 09:36 編集

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

    キャンセル

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/25 17:05

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

    キャンセル

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

  • ただいまの回答率 88.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る