我一直在试图弄清楚为什么返回美国国家/地区列表的Linq查询在下拉列表时不会在代码返回到调用方法时强制转换为List。我得到的错误是:
无法将类型为'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,它从上面的类库中返回一个States of States。
[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方法中的返回值时,会发生错误。
任何有关此演员问题的帮助都可以解释我的错误。
答案 0 :(得分: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
没有DisplayText
或Value
属性,您真正想要归还的并不是很清楚。
我希望期待一种GetStates
方法来返回状态 - 在这种情况下,你已经有了GetStatesList()
,这可能已经完成了你想要的事情。
基本上,你需要考虑你真正想要返回的类型,并使你的方法返回类型和方法体匹配。
答案 1 :(得分:3)
您正在将LINQ查询投影到anonymmous对象,而不是显示无法正常工作的State列表。这两种类型是不兼容的。首先,修改存储库层并摆脱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 });
}