2017-08-04 33 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} 
            } 
       };