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