使用LINQ中的select new返回列表

时间:2011-06-16 09:54:16

标签: c# linq

这是我的方法,它给了我错误。

public List<Project> GetProjectForCombo()
{
    using (MyDataContext db = new MyDataContext (DBHelper.GetConnectionString()))
    {
        var query = from pro in db.Projects
                    select new { pro.ProjectName, pro.ProjectId };

        return query.ToList();
    }
}

如果我改变它:

public List<Project> GetProjectForCombo()
{
    using (MyDataContext db = new MyDataContext (DBHelper.GetConnectionString()))
    {
        var query = from pro in db.Projects
                    select pro;

        return query.ToList();
    }
}

然后它工作正常没有错误。

请告诉我,我怎样才能返回ProjectId和ProjectName。

感谢。

9 个答案:

答案 0 :(得分:100)

方法无法返回匿名类型。它必须与方法返回类型中定义的类型相同。检查GetProjectForCombo的签名并查看您指定的返回类型。

创建一个具有必需属性的ProjectInfo类,然后在新表达式中创建ProjectInfo类型的对象。

class ProjectInfo
{
   public string Name {get; set; }
   public long Id {get; set; }
}

public List<ProjectInfo> GetProjectForCombo()
{
    using (MyDataContext db = new MyDataContext (DBHelper.GetConnectionString()))
    {
        var query = from pro in db.Projects
                    select new ProjectInfo(){ Name = pro.ProjectName, Id = pro.ProjectId };

        return query.ToList();
    }
}

答案 1 :(得分:8)

public List<Object> GetProjectForCombo()
{
   using (MyDataContext db = new MyDataContext (DBHelper.GetConnectionString()))
   {
     var query = db.Project
     .Select<IEnumerable<something>,ProjectInfo>(p=>
                 return new ProjectInfo{Name=p.ProjectName, Id=p.ProjectId);       

     return query.ToList<Object>();
   }

}

答案 2 :(得分:5)

你不能从类中返回匿名类型...(嗯,你可以,但你必须先将它们转换为对象,然后再使用另一侧的反射来重新获取数据)所以你必须创建一个数据的小类,包含在其中。

class ProjectNameAndId
{
    public string Name { get; set; }
    public string Id { get; set; }
}

然后在你的LINQ声明中:

select new ProjectNameAndId { Name = pro.ProjectName, Id = pro.ProjectId };

答案 3 :(得分:3)

public List<Object> GetProjectForCombo()
{
    using (MyDataContext db = new MyDataContext (DBHelper.GetConnectionString()))
     {
         var query = from pro in db.Projects
                     select new {pro.ProjectName,pro.ProjectId};

         return query.ToList<Object>();
    }
}

答案 4 :(得分:1)

返回的是匿名类型,因此创建一个包含2个字段的新类

class BasicProjectInfo {
   string name;
   string id;
}

并返回new BasicProjectInfo(pro.ProjectName, pro.ProjectId);。在这种情况下,您的方法将返回List<BasicProjectInfo>

答案 5 :(得分:1)

您方法的返回值必须是List<Project>

使用select new您正在创建一个匿名类型的实例,而不是Project

答案 6 :(得分:1)

为我的工作尝试这个解决方案

     public List<ProjectInfo> GetProjectForCombo()
      {
    using (MyDataContext db = new MyDataContext 
    (DBHelper.GetConnectionString()))
         {
        return  (from pro in db.Projects
                    select new { query  }.query).ToList();
        }
      }

答案 7 :(得分:0)

您可以按照以下方式执行此操作:

class ProjectInfo
{
    public string Name {get; set; }
    public long Id {get; set; }

    ProjectInfo(string n, long id)
    {
        name = n;   Id = id;
    }
}

public List<ProjectInfo> GetProjectForCombo()
{
    using (MyDataContext db = new MyDataContext (DBHelper.GetConnectionString()))
    {
         var query = from pro in db.Projects
                    select new ProjectInfo(pro.ProjectName,pro.ProjectId);

         return query.ToList<ProjectInfo>();
    }
}

答案 8 :(得分:-1)

您正在创建一种新类型的对象,因此它是匿名的。您可以返回动态。

public dynamic GetProjectForCombo()
{
    using (MyDataContext db = new MyDataContext (DBHelper.GetConnectionString()))
    {
        var query = from pro in db.Projects
                select new { pro.ProjectName, pro.ProjectId };

        return query.ToList();
    }
}