无法转换WhereSelectListIterator类型的对象

时间:2013-03-03 09:08:45

标签: asp.net-mvc-3 linq c#-4.0

我一直在试图弄清楚为什么返回美国国家/地区列表的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方法中的返回值时,会发生错误。

任何有关此演员问题的帮助都可以解释我的错误。

2 个答案:

答案 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没有DisplayTextValue属性,您真正想要归还的并不是很清楚。

我希望期待一种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 });
}