如何使用linq从多个表中选择数据

时间:2017-08-04 14:56:56

标签: c# entity-framework linq

我有两张桌子:

- 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'。

的媒体资源

1 个答案:

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