2013-03-03 162 views
5

我一直在試圖找出爲什麼返回美國國家列表的格式爲下拉列表的Linq查詢在代碼返回到調用方法時不會轉換爲列表。我得到的錯誤是:無法投射WhereSelectListIterator類型的對象

無法轉換類型的對象 'WhereSelectListIterator'2 [StateListing.States,<> f__AnonymousTypea'2 [System.String,System.String]]' 爲類型「System.Collections中。 Generic.List`1 [StateListing.States]'

該錯誤的命名空間StateListing是一個dll庫,它有一個名爲States的類,返回一個如下所示的IEnumerable狀態列表。

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,另有格式化狀態的上市在我看來,一個下拉列表。

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查詢投影到anonymmous對象,而不是顯式無法工作的狀態列表。這兩種類型是不兼容的。因此,通過修改您的存儲庫層開始,擺脫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

感謝Darin的工作。我想我試圖讓它比需要的更復雜。 – Shawn 2013-03-04 05:59:41

6

這就是問題所在:

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

兩個問題:

  • Select不返回List<T>
  • 你不是=選擇States對象;你正在選擇一個匿名類型

第一個是可以使用ToList();第二個是可修復的要麼通過更改您的Select調用通過更改您的方法的返回類型。由於States沒有DisplayTextValue屬性,因此並不十分清楚你真的想要返回什麼。

期待GetStates方法返回的狀態 - 在這種情況下,你已經有了GetStatesList()這大概你想要做什麼已經。

基本上,您需要考慮您真正想要返回的類型,並使您的方法返回類型和方法主體匹配。

+0

感謝喬恩對你的解釋很有幫助。回答爲什麼我沒有DisplayText和State類中的Value屬性的問題是因爲它們被傳遞到Jtable插件中,需要在查詢中爲這些屬性分配「選項」的下拉列表。 – Shawn 2013-03-04 06:09:30

+0

@Shawn:但你明白你的方法聲明它會返回一個'List '與這個不兼容嗎? – 2013-03-04 07:35:21

相關問題