2013-03-03 10 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 на анонимный объект, а не на список состояний, который, очевидно, не может работать. 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; 

Два номера:

  • Select не возвращается List<T>
  • Вы не выбрали States объектов; вы выбираете анонимный тип

Первый фиксируется с использованием ToList(); вторая фиксируется либо, изменив Select на вызов или, изменив тип возвращаемого метода. Не совсем понятно, что вы действительно хотите вернуть, учитывая, что States не имеет собственности DisplayText или Value.

Я бы ожидать метод GetStates вернуть состояние - в этом случае вы уже получили GetStatesList(), который предположительно делает то, что вы хотите уже.

В принципе, вам нужно подумать о типе, который вы действительно хотите вернуть, и сделать так, чтобы возвращали тип вашего метода и тело метода.

+0

Спасибо Jon за ваше объяснение, это было полезно. Чтобы ответить на вопрос о том, почему у меня не было DisplayText, а свойство Value в классе состояний было связано с тем, что они передаются в плагин Jtable, который должен иметь эти свойства, назначенные в запросе, для раскрывающегося списка «параметры». – Shawn

+0

@Shawn: Но вы понимаете, как ваш метод, объявляющий, что он вернет «Список », несовместим с этим? –

Смежные вопросы