2012-03-18 27 views
5

嗨,我有一個問題,香港專業教育學院在它被黑客攻擊了幾個小時我不斷收到錯誤修改LINQ輸出AnonymousType不能分配

屬性或索引「AnonymousType#1.XP」不能被分配到 - 它 是隻讀

在這裏a.XP

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

出現的問題和評論指出,我從來沒有說什麼,我想不要e,我想用改進後的值score.getLevel(a.XP)替代a.XP。

下面是完整的代碼

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

難道你不明白什麼部分錯誤消息的? – svick 2012-03-18 02:06:28

+0

如何解決它,我想用新的和改進的值替代a.XP score.getLevel(a.XP) – 2012-03-18 02:08:16

+0

另外,約定在C#中將您的方法命名爲「GetScore」,而不是' getScore'。類的公共表面區域應使用此版本的PascalCasing。 camelCasing被保留給私人會員,當地人等。 – 2012-03-18 02:15:13

回答

11

匿名類型對象是隻讀的,但考慮到您的代碼示例,有一點需要嘗試在循環這個修改,只是讓你的查詢執行的一部分。

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

如果你發現自己需要進行修改的查詢已被執行之後,那麼你應該繼續和定義一個類,允許這樣的突變,然後選擇成類,而不是匿名類型。

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

// then use it for the query projection 

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

這工作,我認爲右側轉換爲SQL,我試着做什麼,我認爲應該是輸出score.getLevel(XP)= a.User.CommunityScore和它沒有工作,我只是拒絕嘗試其他方面,事實上有點令人尷尬。 – 2012-03-18 02:17:56

5

C#中的匿名類型是不可變的,並且您無能爲力。正如我所看到的,您有兩種選擇:

  1. 創建一個具有可變屬性XP的正常(命名)類型。
  2. 複製舊的對象到新的內容,除了XP

    var modifiedComments = comments.Select(
        c => new 
        { 
         c.UserName, 
         c.PostTitle, 
         c.UserImage, 
         c.Comment, 
         c.UserID, 
         XP = score.getLevel(c.XP) 
        });