2016-06-28 32 views
0

我没有得到如何迭代使用连接检索的数据。 表项目图像在C#中使用JOIN检索和迭代数据MVC4

[img_id] INT   IDENTITY (1, 1) NOT NULL, 
[proj_id] INT   NOT NULL, 
[path] NVARCHAR (50) NOT NULL, 
PRIMARY KEY CLUSTERED ([img_id] ASC), 
CONSTRAINT [FK_projimg_projects] FOREIGN KEY ([proj_id]) REFERENCES [dbo].[Projects] ([proj_id]) 

表项目

[proj_id] INT   IDENTITY (1, 1) NOT NULL, 
[proj_name] NVARCHAR (50) NOT NULL, 
[step1]  NVARCHAR (MAX) NOT NULL, 
[step2]  NVARCHAR (MAX) NOT NULL, 
[step3]  NVARCHAR (MAX) NOT NULL, 
[step4]  NVARCHAR (MAX) NOT NULL, 
[user_id] INT   NOT NULL, 
[materials] NVARCHAR (MAX) NOT NULL, 
[tag]  NVARCHAR (50) NOT NULL, 
PRIMARY KEY CLUSTERED ([proj_id] ASC), 
CONSTRAINT [FK_Projects_user] FOREIGN KEY ([user_id]) REFERENCES [dbo].[Users] ([user_id]) 

我使用以下查询

var tutorial = from proj in de.Projects 
    join image in de.projimgs 
    on proj.proj_id equals image.proj_id 
    select new { 
     proj.proj_name, 
     proj.materials, 
     proj.step1, 
     proj.step2, 
     proj.step3, 
     proj.step4, 
     image.path, 
    }; 

检索到的数据和现在我想迭代数据,包含多个图像,如何每个项目我是否在foreach循环的单次迭代中显示这些图像?任何人都能帮助清楚。 Thankx提前。

回答

1

那么你可以在两个foreach循环迭代,然后像

foreach(project p in tutorial) 
{ 
    foreach(image in p.Images) 
    { 
     //Do your processing 
    } 
} 
0

首先,如果你有你的外键设置为映射属性,拉胡尔的回答是最容易的。如果你确实需要进行连接,那么你的查询不太正确。

请记住你的SQL语句正在做什么。当你做一个INNER JOIN时,你要求每个值的组合都有一个结果。您的查询等效(大约)至:

SELECT proj.proj_name, proj.proj_name, proj.materials, proj.step1, proj.step2, proj.step3, proj.step4, image.path 
FROM Project proj 
INNER JOIN Project_Images image ON image.ProjectId = proj.Id 

鉴于你的SELECT语句,你会得到该项目的多个副本 - 每个图像。你只是循环这些结果。

这听起来像你写的东西是不正确的,你真正想要的是一组由:

var tutorial = from proj in de.Projects 
    join image in de.projimgs on proj.proj_id equals image.proj_id 
    group image by proj into groupedImages 
    select new { Project = groupedImages.Key, Images = groupedImages }; 

然后你在它的循环:

foreach (var project in tutorial) 
{ 
    // Do what you want with project here 
    foreach (var image in project.Images) 
    { 
     // Do what you want with image here 
    } 
}