我试图在我的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;
答案 0 :(得分:0)
如果我查看查询的这个特定部分,它会产生:
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个时间轴发布。
加入以下查询后,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 |
你在输出中得到这种模式吗?
编辑:
如果您希望在结果中每个帖子有1个对象,则可能需要将query
列表转换为字典,这可以与下面的查询类似。
List<MyObject> list = ...;
var map = list
.GroupBy(x => x.KeyedProperty)
.ToDictionary(x => x.Key, x => x.ToList());