C# 无法分配修改LINQ输出类型

C# 无法分配修改LINQ输出类型,c#,.net,linq,C#,.net,Linq,嗨,我有一个问题,我已经破解了好几个小时了,我一直收到错误 无法将属性或索引器“AnonymousType#1.XP”分配给它 是只读的 问题发生在a.XP上 foreach (var a in comments) { a.XP = score.getLevel(a.XP); } 正如一条评论指出的那样,我从不说我想做什么,我想用改进的value score.getLevel(a.XP)代替a.XP 这是完整的代码 protected void GetC

嗨,我有一个问题,我已经破解了好几个小时了,我一直收到错误

无法将属性或索引器“AnonymousType#1.XP”分配给它 是只读的

问题发生在a.XP上

    foreach (var a in comments)
    {
        a.XP = score.getLevel(a.XP);
    }
正如一条评论指出的那样,我从不说我想做什么,我想用改进的value 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();
}

匿名类型的对象是只读的,但给定您的代码示例,不需要在循环中尝试这种修改,只需将其作为查询执行的一部分即可

XP = score.getLevel(fComment.User.CommunityScore)
如果您发现自己需要在查询执行后执行更改,那么您应该继续定义一个允许此类变化的类,然后选择该类而不是匿名类型

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

// then use it for the query projection

select new CommentData 
{
    // ...
}
C#中的匿名类型是不可变的,对此您无能为力。在我看来,你有两个选择:

  • 创建具有可变属性
    XP
    的普通(命名)类型
  • 将旧对象的内容复制到新对象中,除了
    XP

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

  • 您不了解错误消息的哪一部分?如何解决它,我想用新的和改进的值score.getLevel(a.XP)替换a.XP。作为旁白,习惯上用C#命名方法
    GetScore
    ,而不是
    GetScore
    。类的公共表面积应使用此版本的PascalCasing。CAMELWORKS是为私人成员、本地人等保留的。嗯,感谢头部,顺便说一下,保护的方式是什么?保护是可见的派生类,你应该简单地认为它是公共API的一部分,用于设计目的。但是我应该澄清一下,属性和方法应该是PASCALCASE的,公共的还是非公共的。这起作用了我认为右边的部分被转换成了SQL,我试着按照我认为的输出分数来做。getLevel(XP)=a.User.CommunityScore,但它不起作用了我只是拒绝尝试另一边,事实上有点尴尬。