6

我一直试图弄清楚为什么当代码返回调用方法时,返回格式化为下拉列表的美国州列表的 Linq 查询不会转换为列表。我得到的错误是:

无法将 '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 方法中的返回值时,就会发生错误。

任何有关此铸造问题的帮助解释我做错了什么将不胜感激。

4

2 回答 2

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鉴于没有DisplayTextorValue属性,目前还不清楚您真正想要返回什么。

希望有一种GetStates返回状态的方法-在这种情况下,您已经得到了GetStatesList()可能已经完成了您想要的操作。

基本上,您需要考虑您真正想要返回的类型,并使您的方法返回类型和方法主体都匹配。

于 2013-03-03T09:13:01.840 回答
4

您将 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 });
}
于 2013-03-03T09:11:42.413 回答