2011-02-10 24 views
27

Tôi đang gặp rắc rối hiểu lỗi của tôiLINQ đơn giản và Danh mục lỗi: WhereListIterator`1 [công tác]' gõ 'System.Collections.Generic.List`1 [công tác]'

Phương pháp:

public List<Task> GetAllTasks() 
{ 
    var AllTasks = from t in tasks 
        where t.Status.ToString() == "Completed" || t.Status.ToString() == "Pending" 
        select t; 

    return (List<Task>)AllTasks; 
} 

Mã Đằng sau:

protected void Page_Load(object sender, EventArgs e) 
{ 
    TaskList tdl = (TaskList)Session["TodoList"]; 
    List<Task> AllTasks = tdl.GetAllTasks(); 
    string str = ""; 

    foreach (Task t in AllTasks) 
    { 
     str += t.ToString() + "<br />"; 
    } 

    LblTasks.Text = str; 

} 

Sau khi tôi thêm một nhiệm vụ (AddTask.aspx) tôi chuyển hướng đến một trang khác để hiển thị chúng, sau đó tôi nhận được lỗi runtime:

Không thể truyền đối tượng thuộc loại 'WhereListIterator 1[Task]' to type 'System.Collections.Generic.List 1 [Task]'.

Có vấn đề gì với LINQ của tôi không? Tôi vừa học được ngày hôm qua hehe.

Cảm ơn.

Trả lời

53

Bạn chỉ cần .ToList() trực tiếp trên truy vấn hoặc khi bạn trả lại. Như trong

var AllTasks = (from t in tasks 
       where t.Status.ToString() == "Completed" || t.Status.ToString() == "Pending" 
       select t).ToList(); 

Hoặc

return AllTasks.ToList(); 
+0

Cảm ơn rất nhiều! Điều đó hoạt động. Tôi thấy điểm ToList(), nhưng cách diễn viên điển hình không hoạt động? –

+4

@Ken, Các phương thức truy vấn LINQ được thiết kế để hoạt động chống lại bất kỳ chuỗi nào đang thực thi 'IEnumerable ', và chúng được đánh giá một cách lười biếng. Nguồn là một 'Danh sách ' không có liên quan. Nếu bạn muốn các bộ sưu tập cụ thể, họ đã cung cấp các phương thức để hỗ trợ điều đó, chẳng hạn như 'ToArray(), ToList(), ToDictionary(),' v.v. –

+0

Một giải pháp đơn giản như vậy, cảm ơn! –

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