2013-03-03 26 views
5

Próbowałem dowiedzieć się, dlaczego zapytanie Linq, które zwraca listę stanów USA sformatowanych dla rozwijanej listy, nie będzie rzutowane na listę, gdy kod powróci do metody wywołującej. Błąd, który pojawia się:Nie można rzutować obiektu typu WhereSelectListIterator

Nie można rzutować obiektu typu 'WhereSelectListIterator'2 [StateListing.States, <> f__AnonymousTypea'2 [system.string, system.string]]' wpisz „System.Collections. Generic.List`1 [StateListing.States] '

Przestrzeń nazw StateListing od błędu jest biblioteką DLL, która ma klasę zwaną States zwracającą IEnumerable List stanów pokazanych poniżej.

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(); 
     } 
    } 
} 

Pod moją kontrolą wykonuję połączenie z GetStates, które zwraca Listę stanów z powyższej biblioteki klas.

[HttpPost] 
    public JsonResult GetStateOptions() 
    { 
     try 
     { 
      //Return a list of options for dropdown list 
      var states = propertyRepository.GetStates(); 
      return Json(new { Result = "OK", options = states }); 
     } 

W klasie repozytorium nieruchomość Mam dwie metody jedno, aby uzyskać StateList z biblioteki, a inny formatować listę państw na liście rozwijanej w moim zdaniem.

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 
     } 

Błąd występuje, gdy kod osiągnie zwrot w metodzie GetStates.

Każda pomoc w tym problemie z castingiem, wyjaśniająca, co robię źle, byłaby doceniona.

Odpowiedz

3

Projektujesz zapytanie LINQ do obiektu anonimowego, a nie do listy państwowej, która oczywiście nie może działać. Te 2 typy są niekompatybilne. Więc zacznij od modyfikowania warstwy repozytorium i pozbyć się metodą GetStateList:

public class PropertyRepository: IPropertyRepository 
{ 
    public List<States> GetStates() 
    { 
     return States.GetStates().ToList(); 
    } 
} 

a następnie projektu do pożądanej struktury w kontrolerze:

[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

Dziękuję Darin, że pracował. Chyba próbowałem uczynić go bardziej skomplikowanym, niż powinien. – Shawn

6

To jest problem:

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

Dwa numery:

  • Select nie zwraca List<T>
  • Nie jesteś = wybierając obiekty States; wybierasz anonimowy typ

Pierwszy z nich można naprawić, używając ToList(); drugi z nich można naprawić albo, zmieniając swój numer Select przez wywołanie zmiany typu metody. Nie jest jasne, co naprawdę chcesz zwrócić, ponieważ States nie ma właściwości DisplayText lub Value.

bym oczekiwać metodę GetStates zwrócić Zjednoczone - w takim przypadku masz już GetStatesList() który przypuszczalnie robi to, co już chcą.

Zasadniczo trzeba pomyśleć o typie, który naprawdę chce się zwrócić, i ustawić zarówno metodę zwracania typu, jak i jej treść.

+0

Dziękuję Jonowi za wyjaśnienie, które było pomocne. Aby odpowiedzieć na pytanie, dlaczego nie miałem DisplayText, a właściwość Value w klasie stanu była, ponieważ są one przekazywane do wtyczki Jtable, która musi mieć te właściwości przypisane w zapytaniu dla listy rozwijanej "opcji". – Shawn

+0

@Shawn: Ale czy rozumiesz, w jaki sposób twoja metoda deklarująca, że ​​zwróci 'List ' jest niekompatybilna z tym? –

Powiązane problemy