我在查看数据库中显示大多数热门标签时遇到问题。我不确定这个问题标题,所以如果有人有更好的问题,请重新命名。
我需要在我的索引页面上显示最近的帖子,最近的画廊和最受欢迎的标签。我决定使用元组,它工作正常,直到我试图显示最流行的标签。
传递到字典中的模型项是类型的 'System.Tuple
3[photoBlog.Models.Gallery[],photoBlog.Models.Post[],System.Linq.IGrouping
2 [System.Int32,photoBlog.Models.PostTag] []]', 但是这个字典需要一个类型的模型项 'System.Tuple`3 [photoBlog.Models.Gallery [],photoBlog.Models.Post [],photoBlog.Models.PostTag []]'。
正如您所看到的,它为我的视图提供了错误的对象类型。我希望它是一个数组,但它给了我某种System.Linq.Grouping
项。
如您所见,我将其转换为控制器中的数组。
public ActionResult Index()
{
photoBlogModelDataContext _db = new photoBlogModelDataContext();
var posts = _db.Posts.OrderByDescending(x => x.DateTime).Take(4).ToArray();
var galleries = _db.Galleries.OrderByDescending(x => x.ID).Take(4).ToArray();
var posttags = _db.PostTags.GroupBy(x => x.TagID).OrderBy(x => x.Count()).Take(4).ToArray();
return View(Tuple.Create(galleries, posts, posttags));
}
我的观点很简单,请注意,在我尝试添加大多数热门标签之前,这确实有效。
@model Tuple<photoBlog.Models.Gallery[], photoBlog.Models.Post[], photoBlog.Models.PostTag[]>
@foreach (var tag in Model.Item3)
{
@tag.Tag.Name
}
答案 0 :(得分:3)
你可能想要
var posttags = _db.PostTags
.GroupBy(x => x.TagID)
.OrderBy(x => x.Count())
// Take each group and pass the first tag of the group
.Select(g => g.First())
.Take(4)
.ToArray();
目前你正在经过最流行标签的所有8个实例,第二个最受欢迎的所有5个实例等,每个都在他们自己的组中。我想你只想传递每个标签的“例子”。
答案 1 :(得分:1)
我不是故意完全避免施法问题,而是如何简化一点:
public class PopularStatsViewModel{
public Gallery[] Galleries { get; set; }
public Post[] Posts { get; set; }
public PostTags[] Tags { get; set; }
}
新建一个PopularStats实例,并将属性设置为db调用的结果。然后在你看来:
@model photoblog.Models.PopularStatsViewModel
这确实让你超越了投射问题,但更重要的是它让它更容易测试,让你在重构/扩展stats对象方面有更多的自由,并且很清楚你正在使用什么您访问VM属性时的视图。
答案 2 :(得分:0)
尝试将photoBlog.Models.PostTag[]
更改为IGrouping<TagIDType, photoBlog.Models.PostTag>[]