2017-08-04 32 views
-1

我有两个表:如何选择多个表中的数据与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(); 

这是错误消息绑定数据后我有:

数据绑定:“<> 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”的属性。

+3

'但不工作' - 这没有帮助。怎么了?错误信息? – Equalsk

+0

我很抱歉,这是错误消息'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'的属性。' – ahosam

+0

您的代码正在返回所有ID。你需要一个'where'来将结果限制为只有一个id。 – jdweng

回答

1

你的select语句没有在你想要的内容中指定足够的细节。 Project = p不会告诉p或pd中的哪个列(它是您为选择定义的别名)来抓取并放置到您的匿名对象中。

如果你想整个对象,你要根据你需要多少对象正在运行性能问题,特别是如果你并不需要所有您必须指定的信息

你想如

什么
   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} 
            } 
       };