Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ中的select new返回列表_C#_Linq - Fatal编程技术网

C# 使用LINQ中的select new返回列表

C# 使用LINQ中的select new返回列表,c#,linq,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.P

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

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();
    }
}
公共列表GetProjectForCombo() { 使用(MyDataContext db=newmydatacontext(DBHelper.GetConnectionString())) { var query=数据库项目中的pro 选择新建{pro.ProjectName,pro.ProjectId}; 返回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();
    }
}
公共列表GetProjectForCombo() { 使用(MyDataContext db=newmydatacontext(DBHelper.GetConnectionString())) { var query=数据库项目中的pro 选择专业; 返回query.ToList(); } } 然后它工作正常,没有错误


您能告诉我如何只返回
ProjectId
ProjectNam

方法不能返回匿名类型。它必须与方法返回类型中定义的类型相同。检查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();
    }
}
class ProjectInfo
{
公共字符串名称{get;set;}
公共长Id{get;set;}
}
公共列表GetProjectForCombo()
{
使用(MyDataContext db=newmydatacontext(DBHelper.GetConnectionString()))
{
var query=数据库项目中的pro
选择new ProjectInfo(){Name=pro.ProjectName,Id=pro.ProjectId};
返回query.ToList();
}
}

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

class BasicProjectInfo {
   string name;
   string id;
}

并返回
newbasicprojectinfo(pro.ProjectName,ProjectId)。在这种情况下,您的方法将返回一个
列表
您的方法的返回值必须是一个
列表


使用
selectnew
您正在创建匿名类型的实例,而不是
项目

您无法从类返回匿名类型。。。(当然可以,但必须先将它们投射到对象,然后在另一侧使用反射再次取出数据)因此必须创建一个小类,以便将数据包含在其中

class ProjectNameAndId
{
    public string Name { get; set; }
    public string Id { get; set; }
}
然后在您的LINQ声明中:

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

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

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>();
    }
}
class ProjectInfo
{
公共字符串名称{get;set;}
公共长Id{get;set;}
ProjectInfo(字符串n,长id)
{
name=n;Id=Id;
}
}
公共列表GetProjectForCombo()
{
使用(MyDataContext db=newmydatacontext(DBHelper.GetConnectionString()))
{
var query=数据库项目中的pro
选择新的ProjectInfo(pro.ProjectName,ProjectId);
返回query.ToList();
}
}
公共列表GetProjectForCombo()
{
使用(MyDataContext db=newmydatacontext(DBHelper.GetConnectionString()))
{
var query=数据库项目中的pro
选择新建{pro.ProjectName,pro.ProjectId};
返回query.ToList();
}
}
公共列表GetProjectForCombo()
{
使用(MyDataContext db=newmydatacontext(DBHelper.GetConnectionString()))
{
var query=db.Project
.选择(p=>
返回新的ProjectInfo{Name=p.ProjectName,Id=p.ProjectId);
返回query.ToList();
}

}

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

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

为我试试这个解决方案,它很有效

     public List<ProjectInfo> GetProjectForCombo()
      {
    using (MyDataContext db = new MyDataContext 
    (DBHelper.GetConnectionString()))
         {
        return  (from pro in db.Projects
                    select new { query  }.query).ToList();
        }
      }
公共列表GetProjectForCombo() { 使用(MyDataContext db=newmydatacontext) (DBHelper.GetConnectionString()) { 返回(来自数据库项目中的pro) 选择new{query}.query).ToList(); } }
列表是什么?编辑:现在你已经说清楚了;)(请注意,编辑修订版似乎暗示我在代码中添加了
,但问题是初始代码包含在
标记中,而不是缩进,从而删除了尖括号)只是一个简短的注释
projectname和id
不是一个好的类名:)是的……我写得很快。我没有太多地考虑好的类名。我知道这是吹毛求疵,但问题往往会成为有价值的谷歌资源,我想世界会从我的小评论中受益:)……还有一个简短的注释,它将't compile,那里没有定义构造函数。更好的选项应该像Colin Mackay的:
new BasicProject Info{name=project.ProjectName
etcHi Hassan,感谢您的回复,这真的很有帮助。我必须知道,不创建新类,我们也可以获得所需的功能。这很好吗?这对我来说很好。public List GetProjectForCombo(){using(MyDataContext db=new MyDataContext(DBHelper.GetConnectionString()){var query=from pro in db.Projects选择新建项目(){ProjectName=pro.ProjectName,projectd=pro.ProjectId};返回query.ToList();}它可以工作,但不正确。您向被调用方承诺了整个对象,但只提供了其中的部分信息。只有方法的实现才能揭示真相,这是糟糕的设计。您也可以使用无名类,在这种情况下将返回类型对象。这不起作用,因为只提供无参数构造函数和初始值设定项由linq支持到实体(例如,请参阅)我可以问一下为什么我们应该使用
select new
来创建实例吗?@CYB:
select new
用于您希望查询创建某个类的新实例,而不是简单地获取源项。它允许您创建一个完全不同的类的实例,甚至是一个匿名类的实例,就像OP的例子一样ider与LINQ to Entities类似,投影到匿名类的新实例意味着它可以发出一个SQL查询,该查询只获取select语句中使用的列,而不是获取所有列。@CYB:在OP的示例中,首先是s
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();
    }
}
     public List<ProjectInfo> GetProjectForCombo()
      {
    using (MyDataContext db = new MyDataContext 
    (DBHelper.GetConnectionString()))
         {
        return  (from pro in db.Projects
                    select new { query  }.query).ToList();
        }
      }