加入存在图像的3个表

时间:2017-05-30 04:44:21

标签: c# asp.net sql-server asp.net-mvc

我试图在我的MVC5应用程序控制器中进行循环以获取所有时间轴发布,如果在帖子中上传了图片则显示图片。

以下代码获取所有帖子和图片,但如果我上传3张图片相同的帖子,它将被循环3次。

这不是正确的方法吗?

var query = (from i in db.Timeline

         join u in db.Users on i.UserId equals u.Id

         join f in db.UserFiles on i.Id equals f.TimelineId into ps
         from f in ps.DefaultIfEmpty()

         orderby i.PostDate descending
         select new { i.Id, i.UserId, i.Post, i.PostDate, u.FirstName, u.ProfilePic, FileName = f == null ? "No image(s)" : f.FileName + "_thumb." + f.FileExtension }).ToList();

List<TimelineLoop> cModel = new List<TimelineLoop>();

foreach (var item in query)
{
    cModel.Add(new TimelineLoop
    {
        Id = item.Id,
        UserId = item.UserId,
        Post = item.Post,
        PostDate = item.PostDate,
        Name = item.FirstName,
        ProfilePic = item.ProfilePic,

        FileName = item.FileName

    });
}
return cModel;

1 个答案:

答案 0 :(得分:0)

  1. 如果我查看查询的这个特定部分,它会产生:

     from i in db.Timeline
     join u in db.Users on i.UserId equals u.Id
    

    timelinePost1 | USER1

    timelinePost2 | USER1

    timelinePost3 | USER2

    =&GT; 1个用户可以有超过1个时间轴发布。

  2. 加入以下查询后,1中的结果将加入UserFiles。我假设一个时间轴帖子可以有很多图片。如果你将3张图片上传到同一篇文章,你会发现这样的事情:

     join f in db.UserFiles on i.Id equals f.TimelineId into ps
     from f in ps.DefaultIfEmpty()
    

    它产生:

    timelinePost1 | user1 |照片1

    timelinePost1 | user1 |照片2

    timelinePost1 | user1 |照片3

    timelinePost2 | user1 |

    timelinePost3 | user2 |

  3. 你在输出中得到这种模式吗?

    编辑:

    如果您希望在结果中每个帖子有1个对象,则可能需要将query列表转换为字典,这可以与下面的查询类似。

          List<MyObject> list = ...;
          var map = list
         .GroupBy(x => x.KeyedProperty)
          .ToDictionary(x => x.Key, x => x.ToList());
    

    参考:LINQ - Convert List to Dictionary with Value as List