LINQ - 将组转换为数组

时间:2012-06-01 14:20:51

标签: c# asp.net-mvc asp.net-mvc-3 linq

我在查看数据库中显示大多数热门标签时遇到问题。我不确定这个问题标题,所以如果有人有更好的问题,请重新命名。

方案

我需要在我的索引页面上显示最近的帖子,最近的画廊和最受欢迎的标签。我决定使用元组,它工作正常,直到我试图显示最流行的标签。

错误

  

传递到字典中的模型项是类型的   '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
}

3 个答案:

答案 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>[]