LINQ查询匿名类型不能转换到POCO对象

问题描述:

我有以下LINQ查询...LINQ查询匿名类型不能转换到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>(); 
} 

,我有我试图填充以下视图对象....

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; 
} 

项目可能有0个或其上的消息。我的目标是将一个UserProject对象列表传递给我的MVC视图,每个UserProject对象都可以有一组消息。我得到的错误是如下

错误1个实例参数:无法从“System.Linq.IQueryable<AnonymousType#1>”转换为“System.Collections.Generic.IEnumerable<Riebro.Services.UserProject>

错误2“System.Linq.IQueryable<AnonymousType#1>”不包含“ToList”的定义和最佳推广方法重载“System.Linq.Enumerable.ToList<TSource>(System.Collections.Generic.IEnumerable<TSource>)”有一些无效参数

目前的信息实体不具有导航属性项目......应该......我会在稍后补充说,变革......但此刻我只需要ke ep在工作。

编辑

目前的情况是,现在的LINQ查询看起来像这样...

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>(); 

和视图类看起来像这样...

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; 
} 

,我现在得到以下错误...

错误1 C注释隐式地将类型'System.Collections.Generic.IEnumerable<Riebro.Message>'转换为'System.Collections.Generic.List<Riebro.Message>'。存在明确的转换(您是否缺少演员?)

您应该在select语句中创建UserProject实例而不是匿名对象。

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

+1此外,初始化Messages的'UserProject()'构造函数应该公开,否则它将无法访问。 – 2012-02-19 21:37:04

+0

谢谢......最初的工作......但我现在坚持......错误不能隐式地将类型'System.Collections.Generic.IEnumerable '转换为'System.Collections.Generic。列表”。存在明确的转换(您是否缺少演员?) – 2012-02-19 23:31:25

+2

在查询结尾处使用ToList() – 2012-02-20 06:44:16