2012-03-18 25 views
5

Hi tôi có một vấn đề và ive được hack vào nó trong nhiều giờ tôi tiếp tục nhận được lỗiSửa LINQ ra AnonymousType không thể được gán

tài sản hoặc indexer 'AnonymousType # 1.XP' không thể được gán cho - nó được đọc chỉ

vấn đề xảy ra trên a.XP đây

foreach (var a in comments) 
    { 
     a.XP = score.getLevel(a.XP); 
    } 

và như một bình luận chỉ ra tôi không bao giờ nói những gì tôi muốn don e, tôi không thể thay thế a.XP bằng giá trị được cải thiện score.getLevel (a.XP).

Ở đây có đầy đủ các mã

protected void GetComments() 
{ 
    TimberManiacsDataContext db = new TimberManiacsDataContext(); 
    Score score = new Score(); 
    var comments = (from fComment in db.Comments 
        where fComment.PublishID == Convert.ToInt32(Request.QueryString["Article"]) 
        orderby fComment.DateTime descending 
        select new 
        { 
         UserName = fComment.User.UserLogin.Username, 
         PostTime = fComment.DateTime, 
         UserImage = fComment.User.UserGeneralInfo.ProfilePicture, 
         Comment = fComment.Comment1, 
         UserID = fComment.UserID, 
         XP = fComment.User.CommunityScore 
        }).Take(10).ToList(); 

    foreach (var a in comments) 
    { 
     a.XP = score.getLevel(a.XP); 
    } 
    Commentlist.DataSource = comments; 
    Commentlist.DataBind(); 
} 
+3

gì một phần của thông báo lỗi không có hiểu không? – svick

+0

làm thế nào để giải quyết nó, tôi whould như để thay thế a.XP với giá trị mới và cải thiện score.getLevel (a.XP) –

+0

Như một sang một bên, nó là quy ước đặt tên phương pháp của bạn 'GetScore' trong C#, thay vì' getScore'. Diện tích bề mặt công cộng của các lớp nên sử dụng phiên bản PascalCasing này. camelCasing được dành riêng cho các thành viên tư nhân, người dân địa phương, v.v. –

Trả lời

11

ẩn danh, đánh máy các đối tượng được chỉ đọc, nhưng với mẫu mã của bạn, có rất ít cần phải cố gắng sửa đổi này trong vòng lặp, chỉ cần làm cho nó một phần của thực hiện truy vấn của bạn .

XP = score.getLevel(fComment.User.CommunityScore) 

Nếu bạn thấy mình cần thay đổi thực hiện sau khi truy vấn đã được thực hiện, thì bạn nên đi trước và định nghĩa một lớp cho phép đột biến như vậy và sau đó chọn vào đó lớp thay vì kiểu nặc danh.

class CommentData { ... } // define this type with your properties 

// then use it for the query projection 

select new CommentData 
{ 
    // ... 
} 
+0

Điều đó làm việc tôi nghĩ rằng phía bên tay phải đã được chuyển đổi thành SQL, tôi đã thử làm điều đó trên những gì tôi nghĩ rằng whould được output.getLevel (XP) = a.User.CommunityScore và nó đã không làm việc tôi chỉ đơn giản là từ chối thử khác bên, một chút xấu hổ trong thực tế. –

5

Các loại ẩn danh trong C# là không thay đổi và bạn không thể làm gì với nó. Như tôi thấy, bạn có hai tùy chọn:

  1. Tạo loại bình thường (có tên) có đặc tính có thể thay đổi XP.
  2. Sao chép nội dung của đối tượng cũ sang cái mới, trừ XP:

    var modifiedComments = comments.Select(
        c => new 
        { 
         c.UserName, 
         c.PostTitle, 
         c.UserImage, 
         c.Comment, 
         c.UserID, 
         XP = score.getLevel(c.XP) 
        }); 
    
Các vấn đề liên quan