2013-03-03 82 views
5

私は、コードが呼び出し元のメソッドに戻るときに、ドロップダウンリスト用にフォーマットされた米国の州のリストを返すLinqクエリがリストにキャストされない理由を理解しようとしています。私が手にエラーがある:型 'WhereSelectListIterator'2 [StateListing.States、<> f__AnonymousTypea'2 [可能System.String、可能System.String]]'「にSystem.Collectionsを入力するためのオブジェクトをキャストすることができませんWhereSelectListIterator型のオブジェクトをキャストできません

エラーからの名前空間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を呼び出します。私は図書館からStateListを取得するには二つの方法1を持っている、と私の見解では、ドロップダウンリストのための状態のリストをフォーマットするには、別のプロパティリポジトリクラスで

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

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メソッド内のリターンに達したときに発生します。

私が間違っていることを説明するこのキャスティングの問題についての助けがあれば幸いです。

答えて

3

LINQクエリを匿名オブジェクトに投影していますが、明らかに機能しない状態リストには投影していません。 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 }); 
} 
+0

ダーリンに感謝します。私はそれが必要以上に複雑にしようとしていたと思います。 – Shawn

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番目の方法はのいずれかのいずれかの方法で戻り値の型を変更してSelectまたはのいずれかの値を変更することで修正可能です。 StatesにはDisplayTextまたはValueというプロパティがないので、実際に返すものは本当に明確ではありません。

私は状態を返すためにGetStates方法を期待 - あなたはすでに、おそらくあなたはすでに何をしたいんGetStatesList()を持っている場合には。

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

+0

ありがとうございました。なぜDisplayTextを持たなかったのかという疑問に答えるために、StateクラスのValueプロパティは、Jtableプラグインに渡されているため、これらのプロパティが "options"のドロップダウンリストのクエリに割り当てられる必要があります。 – Shawn

+0

@ Shawn:しかし、あなたが 'List 'を返すと宣言するメソッドがこれと互換性がないことを理解していますか? –

関連する問題