2010-05-30 18 views
7

tôi cần phải lấy kết quả của một truy vấn:chuyển đổi truy vấn LINQ to ICollection

var query = from m in db.SoilSamplingSubJobs where m.order_id == id select m; 

và chuẩn bị như một ICollection để tôi có thể có một cái gì đó giống như

ICollection<SoilSamplingSubJob> subjobs 

tại thời điểm tôi tạo ra một danh sách, điều này không phù hợp với nhu cầu của tôi:

query.ToList(); 

tôi phải làm gì - đó là truy vấn.ToIcollection()?

+1

Bất kỳ lý do cụ thể cho việc gắn thẻ câu hỏi này với 'asp.net-mvc'? –

Trả lời

14

Danh sách là một ICollection. Bạn có thể thay đổi bạn query.ToList() mã để sau đây.

query.ToList() as ICollection<SoilSamplingSubJob>; 

Bạn đặt câu hỏi giống như truy vấn này được trả lại dưới dạng kết quả hàm. Nếu đây là trường hợp hãy nhớ rằng các đối tượng LINQ to SQL được kết nối theo mặc định, do đó bạn sẽ cần phải quản lý nơi bối cảnh cơ sở dữ liệu của bạn được mở và đóng. Ngoài ra, bạn có thể tạo DTO (Data Transfer Objects) giữ dữ liệu bạn muốn sử dụng trong phần còn lại của chương trình. Các đối tượng này có thể vừa với thứ bậc đối tượng của bạn theo bất kỳ cách nào bạn muốn.

Bạn cũng có thể tạo các DTO này làm một phần của truy vấn.

var query = from m in db.SoilSamplingSubJobs where m.order_id == id 
      select new SubJobDTO { 
       OrderNumber = m.order_id 
      }; 
return query.ToList() as ICollection<SubJobDTO>; 
+0

cảm ơn Jason! nhiều nghĩa vụ – bergin

0

Vì truy vấn triển khai IEnumerable, bạn có thể chuyển nó tới hàm tạo của tập hợp lựa chọn của bạn. ICollection là một giao diện, được thực hiện bởi một số lớp (bao gồm List<T>, ToList trả về) với các đặc tính hiệu suất khác nhau.

0

Cú pháp hơi khác, bạn có thể làm điều gì đó như thế này có thể cắt giảm những gì đi vào ICollection. Đây là loại phương pháp là rất tốt cho góc và MVC khi bạn có một bảng rất lớn nhưng chỉ muốn tải một số đạo cụ vào trang cshtml:

ICollection<SoilSamplingSubJob> samples = dbContext.GetQuery().Where(m => m.order_id == id) 
.AsEnumerable().Select(s => new 
      { 
       Id = s.order_id, 
       CustomProperty = s.some_thing 
      }).ToList() as ICollection<SoilSamplingSubJob>