2012-03-18 8 views
5

Hola tengo un problema y que he estado cortando durante horas me siguen dando el errorModificar LINQ salida AnonymousType no puede ser asignado

de inmuebles o indexador 'AnonymousType # 1.XP' no puede ser asignado a - que es de sólo lectura

el problema se produce en el a.XP aquí

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

y como un comentario señaló que nunca decir lo que quiero Don e, me gustaría sustituir a.XP con el valor mejorado score.getLevel (a.XP).

Aquí está el código completo

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

¿Qué parte del mensaje de error que no entiendes? – svick

+0

cómo solucionarlo, me gustaría sustituir el a.XP con el nuevo y mejorado valor score.getLevel (a.XP) –

+0

Como nota aparte, es una convención nombrar su método 'GetScore' en C#, en lugar de' getScore'. El área de superficie pública de las clases debe usar esta versión de PascalCasing. camelCasing está reservado para miembros privados, lugareños, etc. –

Respuesta

11

anónimamente-escriben los objetos son de sólo lectura, pero teniendo en cuenta su ejemplo de código, hay poca necesidad de tratar esta modificación en el circuito, simplemente hacen que sea parte de su ejecución de la consulta .

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

Si usted se encuentra en necesidad de los cambios que realizan después de la consulta ha ejecutado, entonces debería seguir adelante y definir una clase que permite que tales mutaciones y luego seleccione en esa clase en lugar del tipo anónimo.

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

// then use it for the query projection 

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

Eso funcionó, pensé que el lado derecho se había convertido en SQL, intenté hacerlo en lo que pensé que sería el resultado score.getLevel (XP) = a.User.CommunityScore y no funcionó, simplemente rechacé el intento del otro lado, un poco embarazoso de hecho. –

5

Los tipos anónimos en C# son inmutables y no hay nada que puedas hacer al respecto. Como yo lo veo, tiene dos opciones:

  1. Cree un tipo normal (con nombre) que tenga una propiedad mutable XP.
  2. Copiar el contenido del objeto antiguo en uno nuevo, excepto XP:

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