6

コードが呼び出し元のメソッドに戻ったときに、ドロップダウンリスト用にフォーマットされた米国の州のリストを返すLinqクエリがリストにキャストされない理由を理解しようとしています。私が得るエラーは次のとおりです。

タイプ 'WhereSelectListIterator'2[StateListing.States,<>f__AnonymousTypea'2[System.String,System.String]]' のオブジェクトをタイプ 'System.Collections.Generic.List`1[StateListing.States]' にキャストできません

エラーからの名前空間 StateListing は、以下に示す状態の IEnumerable リストを返す States というクラスを持つ dll ライブラリです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace StateListing
{
    public class States 
    {
        public string StateAbbriviation { get; set; }
        public int StateID { get; set; }
        public string StateName { get; set; }
        static int cnt = 0;

        public static IEnumerable<States> GetStates()
        {
            return new List<States>
            {
                new States
                {
                    StateAbbriviation = "AL",
                    StateID=cnt++,   
                    StateName = "Alabama"
                },
                new States
                {
                    StateAbbriviation = "AL",
                    StateID=cnt++,
                    StateName = "Alaska"
                }

                //Continued on with the rest of states

            }.AsQueryable();
        }
    }
}

私のコントロールでは、上記のクラス ライブラリから州のリストを返す GetStates を呼び出します。

    [HttpPost]
    public JsonResult GetStateOptions() 
    {
        try
        {
            //Return a list of options for dropdown list
            var states = propertyRepository.GetStates(); 
            return Json(new { Result = "OK", options = states });
        }

プロパティ リポジトリ クラスには、ライブラリから StateList を取得するメソッドと、ビューのドロップダウン リストの状態のリストをフォーマットするメソッドの 2 つがあります。

    public List<States> GetStateList()
    {
        var items = (from s in States.GetStates()
                    select s).ToList();

        return items;
    }

    List<States> IPropertyRepository.GetStates() 
    {
        try
        {
            List<States> RawStates = GetStateList();
            var stateList = RawStates.Select(c => new { DisplayText = c.StateName,   Value = c.StateID.ToString() });
            return (List<States>)stateList;  //<=== Error 
        }

コードが GetStates メソッド内の戻り値に到達すると、エラーが発生します。

私が間違っていることを説明するこのキャストの問題について助けていただければ幸いです。

4

2 に答える 2

6

これが問題です:

var stateList = RawStates.Select(c => new { DisplayText = c.StateName, 
                                            Value = c.StateID.ToString() });
return (List<States>)stateList;

2 つの問題:

  • Selectを返さないList<T>
  • Statesオブジェクトを選択しているわけではありません。匿名型を選択しています

最初のものはToList();を使用して修正できます。2つ目は、呼び出しを変更する、メソッドの戻り値の型を変更することで修正できます。またはプロパティがないことを考えると、本当に何を返したいのかは明確ではありません。SelectStatesDisplayTextValue

状態を返すメソッドが期待GetStatesされます-その場合、GetStatesList()おそらくあなたがすでに望んでいることをすでに行っています。

基本的には、本当に返したい型を考えて、メソッドの戻り値の型とメソッド本体の両方を一致させる必要があります。

于 2013-03-03T09:13:01.840 に答える
4

LINQ クエリを匿名オブジェクトに投影しており、明らかに機能しない State リストには投影していません。2 種類は互換性がありません。したがって、リポジトリ レイヤーを変更することから始めて、GetStateListメソッドを削除します。

public class PropertyRepository: IPropertyRepository
{
    public List<States> GetStates() 
    {
        return States.GetStates().ToList();
    }
}

次に、コントローラーの目的の構造に投影します。

[HttpPost]
public JsonResult GetStateOptions() 
{
    var states = propertyRepository.GetStateList(); 
    var options = states.Select(x => new
    {
        DisplayText = c.StateName,   
        Value = c.StateID.ToString()
    }).ToList();
    return Json(new { Result = "OK", options = states });
}
于 2013-03-03T09:11:42.413 に答える