2010-06-08 30 views
5

Tôi muốn thực hiện một mục chọn nhất định để tải chậm sau này trong truy vấn LINQ của tôi. Đây là câu hỏi của tôiLàm thế nào để chuyển truy vấn LINQ này thành tải chậm

var posts = from p in context.post 
      where p.post_isdeleted == false && p.post_parentid == null 
      select new 
      { 
       p.post_date, 
       p.post_id, 
       p.post_titleslug, 
       p.post_votecount, 
       FavoriteCount = context.PostVotes.Where(x => x.PostVote_postid == p.post_id).Count() //this should load latter 
      }; 

Tôi đã xóa mặt hàng FavoriteCount trong truy vấn chọn và muốn nó đến ba thêm vào sau dựa trên điều kiện nhất định. Đây là cách tôi có nó tải lười biếng

if (GetFavoriteInfo) 
{ 
    posts = posts.Select(x => new { FavoriteCount = context.PostVotes.Where(y => y.PostVote_postid == x.post_id).Count() }); 
} 

Tôi nhận được lỗi cú pháp với truy vấn trên. Làm cách nào để sửa lỗi này

Trả lời

2

Khi bạn xóa FavoriteCount trong truy vấn trước đó, loại ẩn danh được gán cho posts không còn trường đó nữa; sau đó trong truy vấn thứ hai, bạn tạo một loại khác loại ẩn danh chỉFavoriteCount trong đó - vì vậy khi bạn cố gắng gán lại cho posts bạn gặp lỗi loại không tương thích.

Một cách để làm điều này sẽ rời khỏi FavoriteCount trong truy vấn đầu tiên, nhưng làm cho nó FavoriteCount = -1 (hoặc một số giá trị khác để chỉ ra nó đã không được nạp chưa), và sau đó trong một giây bạn có thể làm:

posts = posts.Select(p => new { // reassign existing stuff, 
           p.post_date, 
           p.post_id, 
           p.post_titleslug, 
           p.post_votecount, 
           FavoriteCount = context.etc.etc. 
           }); 

Bạn phải thực hiện chuyển nhượng lại vì các loại ẩn danh không thay đổi được; một cách xung quanh đó sẽ là tạo một lớp PostInfo với các trường đó, sau đó bạn chỉ có thể đặt FavoriteCount trong truy vấn thứ hai.

+0

Tôi là người mới ở đây..Bạn có ví dụ về phân bổ lại không? – Luke101

+0

@ Luke101: Ví dụ được cập nhật. – tzaman

1

1.- loại mà bạn đang chiếu trên var đầu tiên không phải là cùng loại trên assigment thứ hai kể từ đầu tiên là một loại Anonymus

bạn có thể thử này

var posts = from p in context.post 
      where p.post_isdeleted == false && p.post_parentid == null 
      select new 
      { 
       p.post_date, 
       p.post_id, 
       p.post_titleslug, 
       p.post_votecount, 
       FavoriteCount = GetFavoriteInfo?context.PostVotes.Where(x => x.PostVote_postid == p.post_id).Count():null //this should load latter 
      }; 
+0

Tôi đã có suy nghĩ tương tự - nhưng L2S ​​dịch điều này thành câu lệnh SQL và kế hoạch thực hiện trong SSMS cho thấy nó quét chỉ mục PostVotes bất kể GetFavoriteInfo là đúng hay sai. –

1

blog entry này sẽ giúp bạn. Một điều nữa, bạn có thể bật/tắt tải chậm bằng cách sử dụng thuộc tính sau của đối tượng Ngữ cảnh dữ liệu.

context.DeferredLoadingEnabled = false; 
Các vấn đề liên quan