我有两张桌子:
- Projects
ID
ProjectName
Areas
PaymentSystem
- ProjectDetails
DetailsID
ProjectDetailName
ProjectDetailImage
ProjectID
这些表有一对一的关系我想选择所有项目的项目详细信息与我编写此查询的ID相匹配但不起作用:
var query = from p in context.Projects
join pd in context.ProjectDetails
on p.ID equals pd.ProjectID
select new
{
Project=p,
ProjectDetail=pd
};
GVAllProjects.DataSource = query.ToList();
GVAllProjects.DataBind();
这是绑定数据后的错误消息:
DataBinding:'<> f__AnonymousType0`2 [[Project,App_Code.nvgnvnbf,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null],[ProjectDetail,App_Code.nvgnvnbf,Version = 0.0。 0.0,Culture = neutral,PublicKeyToken = null]]'不包含名称为' ID'。
的媒体资源
答案 0 :(得分:1)
您的select语句未指定您想要的详细信息。 Project = p不会告诉p或pd中的哪一列(您为select定义的别名)要抓取并放入匿名对象。
如果你想要整个对象,你将会遇到性能问题,具体取决于你正在使用多少个对象,特别是如果你不需要所有的信息
您必须指定所需内容,例如
select new
{
ProjectId=p.Id,
ProjectDetailID=pd.DetailsId
};
处理此问题的一种方法是创建一个View模型类,然后在linq语句的select new子句中使用它。
例如,您的视图模型应该类似于
public class DetailedProjectView
{
public int ProjectId {get;set;}
public IEnumerable<Project> MainProjects {get;set;} // Not Required
public IEnumerable<ProjectDetails> MainProjectDetails {get;set;}
}
然后在linq语句中使用此类来选择键:值对到新的视图模型对象
var query = from p in context.Projects
select new DetailedProjectView
{
ProjectId=p.Id,
ProjectDetails= (from pd in context.ProjectDetails
where pd.Id == p.Id
select new DetailedProjectView
{
ProjectId = pd.Id
MainProjectDetails = select new ProjectDetails{ ProjectName = pd.ProjectDetailName}
}
};