2013-03-03 33 views
5

Tôi đã cố gắng tìm ra lý do tại sao truy vấn LINQ trả về danh sách các quốc gia Hoa Kỳ được định dạng cho danh sách thả xuống sẽ không truyền vào Danh sách khi mã trả về phương thức gọi. Các lỗi mà tôi nhận được là:Không thể truyền đối tượng loại WhereSelectListIterator

Không thể cast đối tượng của loại 'WhereSelectListIterator'2 [StateListing.States, <> f__AnonymousTypea'2 [System.String, System.String]]' gõ 'System.Collections. Generic.List`1 [StateListing.States] '

Không gian tên StateListing từ lỗi, là thư viện dll có một lớp gọi là States trả về danh sách các trạng thái được hiển thị dưới đây.

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

Trong kiểm soát của tôi, tôi thực hiện cuộc gọi đến GetStates trả về danh sách các quốc gia từ thư viện lớp học ở trên.

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

Trong lớp lưu trữ thuộc tính, tôi có hai phương pháp để lấy danh sách trạng thái từ thư viện và một phương thức khác để định dạng danh sách trạng thái cho danh sách thả xuống trong chế độ xem của tôi.

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 
     } 

Lỗi xảy ra khi mã đạt đến trả về trong phương thức GetStates.

Bất kỳ trợ giúp nào về vấn đề truyền này giải thích những gì tôi đang làm sai sẽ được đánh giá cao.

Trả lời

3

Bạn đang chiếu truy vấn LINQ của mình vào một đối tượng ẩn danh chứ không phải danh sách trạng thái rõ ràng không thể hoạt động. 2 loại không tương thích. Vì vậy, bắt đầu bằng cách thay đổi lớp kho của bạn và thoát khỏi GetStateList phương pháp:

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

và sau đó dự án để cơ cấu mong muốn trong điều khiển của bạn:

[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

Cảm ơn Darin đã làm việc. Tôi đoán tôi đã cố gắng làm cho nó phức tạp hơn cần thiết. – Shawn

6

Đây là vấn đề:

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

Hai vấn đề:

  • Select không trả lại số List<T>
  • Bạn không = chọn States đối tượng; bạn đang chọn một loại ẩn danh

Đầu tiên có thể khắc phục được bằng cách sử dụng ToList(); thứ hai là có thể sửa được hoặc bằng cách thay đổi Select gọi hoặc bằng cách thay đổi loại trả về của phương thức của bạn. Nó không thực sự rõ ràng những gì bạn thực sự muốn quay trở lại, cho rằng States không có tài sản DisplayText hoặc Value.

Tôi sẽ mong đợi phương thức GetStates để trả lại các trạng thái - trong trường hợp đó bạn đã có GetStatesList(), có lẽ bạn sẽ làm những gì bạn muốn.

Về cơ bản, bạn cần suy nghĩ về loại bạn thực sự muốn trả lại và đặt cả kiểu trả về của phương thức và phương thức đối sánh.

+0

Cảm ơn Jon vì lời giải thích của bạn, nó rất hữu ích. Để trả lời câu hỏi tại sao tôi không có thuộc tính DisplayText và Value trong lớp trạng thái là vì chúng đang được chuyển vào một plugin Jtable cần phải có các thuộc tính này được chỉ định trong truy vấn cho danh sách thả xuống "tùy chọn". – Shawn

+0

@Shawn: Nhưng bạn có hiểu cách phương thức của bạn tuyên bố rằng nó sẽ trả về một 'List ' không tương thích với điều này? –

Các vấn đề liên quan