2012-02-19 7 views
6

Tengo la siguiente consulta LINQ ...consulta LINQ tipo anónimo no puede ser convertido en objeto POCO

public List<UserProject> GetProjectsByUser(int userid) 
{ 
    //var query = 
    return (
       from p in this.Entities.Projects 
       join c in this.Entities.Categories 
        on p.CategoryId equals c.CategoryId 
       join u in this.Entities.Users 
        on p.UserId equals u.UserId 
       where p.UserId == 11 
       select 
        new 
         { 
          p.ProjectId, 
          u.UserName, 
          p.UserId, 
          ProjectName = p.Name, 
          ProjectDescription = p.Description, 
          CategoryName = c.Name 
         } 
       into pcup 
       join m in this.Entities.Messages 
        on 
        pcup.ProjectId equals m.ProjectId 
        into pm 
       select 
        new { 
         pcup.ProjectId, 
         pcup.UserId, 
         pcup.ProjectName, 
         pcup.ProjectDescription, 
         Messages = pm 
        } 
      ).ToList<UserProject>(); 
} 

y tengo el siguiente objeto de vista que estoy tratando de poblar ....

public class UserProject 
{ 
    UserProject() 
    { 
     Messages = new EnumerableQuery<Message>(); 
    } 

    public int ProjectId; 
    public int UserId; 
    public string ProjectName; 
    public string ProjectDescription; 
    public IEnumerable<Message> Messages; 
    //public string UserName; 
    //public string CategoryName; 
    //public int CategoryId; 
} 

Un proyecto puede tener 0 o mensajes en él. Mi objetivo aquí es pasar una lista de objetos UserProject a mi vista MVC, cada objeto UserProject puede tener una colección de mensajes. El error que consigo es el siguiente

error argumento de 1 Instancia: no se puede convertir de 'System.Linq.IQueryable<AnonymousType#1>' a 'System.Collections.Generic.IEnumerable<Riebro.Services.UserProject>'

Error 2 'System.Linq.IQueryable<AnonymousType#1>' no contiene una definición para 'ToList' y la mejor extensión sobrecarga del método 'System.Linq.Enumerable.ToList<TSource>(System.Collections.Generic.IEnumerable<TSource>)' tiene algunos argumentos no válidos

Actualmente la entidad mensajes no tiene una propiedad de navegación a Proyectos ... debería ... voy a añadir que el cambio más tarde ... pero por el momento yo sólo Necesito ke ep en el trabajo.

EDITAR

Tal como está ahora la consulta LINQ se parece a esto ...

return (
       from p in this.Entities.Projects 
       join c in this.Entities.Categories 
        on p.CategoryId equals c.CategoryId 
       join u in this.Entities.Users 
        on p.UserId equals u.UserId 
       where p.UserId == userid 
       select 
        new 
         { 
          p.ProjectId, 
          u.UserName, 
          p.UserId, 
          p.Name, 
          p.Description, 
          //CategoryName = c.Name 
         } 
        into pcup 
        join m in this.Entities.Messages 
         on 
         pcup.ProjectId equals m.ProjectId 
         into pm 
        select 
         new UserProject { 
          ProjectId = pcup.ProjectId, 
          UserId = pcup.UserId, 
          ProjectName = pcup.Name, 
          ProjectDescription = pcup.Description, 
          Messages = pm 
         } 
      ).ToList<UserProject>(); 

y la clase de vista se parece a esto ...

public class UserProject 
{ 
    public UserProject() 
    { 
     Messages = new List<Message>(); 
    } 

    public int ProjectId; 
    public string UserName; 
    public int UserId; 
    public string ProjectName; 
    public string ProjectDescription; 
    public List<Message> Messages; 
    //public string CategoryName; 
    //public int CategoryId; 
} 

y yo estoy ahora Obteniendo el siguiente error ...

Error 1 C annot convierte implícitamente el tipo 'System.Collections.Generic.IEnumerable<Riebro.Message>' en 'System.Collections.Generic.List<Riebro.Message>'. Existe una conversión explícita (¿falta un molde?)

Respuesta

15

Debe crear una instancia de UserProject en lugar de un objeto anónimo en su instrucción de selección.

select new UserProject 
      { 
       ProjectId = pcup.ProjectId, 
       UserID = pcup.UserId, 
       ProjectName = pcup.ProjectName, 
       ProjectDescription = pcup.ProjectDescription, 
       Messages = pm 
      } 
+4

+1 además, el constructor 'UserProject()', que inicializa 'Messages', debe hacerse público, de lo contrario no será accesible. –

+0

Gracias ... eso funciona inicialmente ... pero ahora estoy atascado con ... Error No se puede convertir implícitamente el tipo 'System.Collections.Generic.IEnumerable ' a 'System.Collections.Generic. Lista '. Existe una conversión explícita (¿falta un molde?) –

+2

Use ToList() al final de su consulta –

Cuestiones relacionadas