1

我正在做一个 MVC 项目。我需要返回一个对象,该对象将菜单项分组为四个一组,以使用 foreach 迭代在视图中显示。由于这是一个传递给视图的模型,我需要返回一个可以绑定在 .cshtml 上的非泛型集合类。

我的想法是我可以根据 LINQ 中的某种类型的计数对列表进行分组,以向每个 Dictionary 键添加四个新的列表项。但是,我还没有找到一个足以满足字典的表达式。我可以通过创建另一种方法并再次遍历集合以根据计数分配键来相当容易地解决这个问题,但这似乎是不必要的迭代和不好的做法。

目前,我正在使用以下查询。

        var itemsDict = rssDataContext.rss_Application_Blog_Category_Relationships
            .Where(x => x.Application_Blog.rss_Application.ID == 1)
            .Where(x => x.Blog_Category_ID == 1)
            .Select(x => new MenuItem
            {
            Name = x.rss_Application_Blog.Blog_Title,
            Uri = x.rss_Application_Blog.Blog_Uri,
            ID = x.rss_Application_Blog.ID
            });

但是有没有办法将此查询分组为 4 个类,然后填充到 Dictionary<int, List<MenuItem>> 中?

4

2 回答 2

3

我怀疑你可以这样做:

var itemsDict = rssDataContext.rss_Application_Blog_Category_Relationships
    .Where(x => x.Application_Blog.rss_Application.ID == 1)
    .Where(x => x.Blog_Category_ID == 1)
    .Select(x => new { 
        x.rss_Application_Blog.BlogTitle,
        x.rss_Application_Blog.BlogUri,
        x.rss_Application_Blog.ID
    })
    .AsEnumerable() // Do the rest of the query in-process
    .Select((value, index) => new { value, index })
    .ToLookup(pair => pair.index % 4,
              pair => new MenuItem {
                 Name = pair.value.Blog_Title,
                 Uri = pair.value.Blog_Uri,
                 ID = pair.value.ID
              });

请注意,这会返回 aLookup而不是 a Dictionary,但这实际上是您想要的更接近的模型。

于 2012-04-16T08:40:51.627 回答
2

@JonSkeet 的解决方案非常好。这是使用GroupBy创建子列表和ToDictionary将它们投影到最终结果中的替代实现:

var itemsDict = rssDataContext.rss_Application_Blog_Category_Relationships
    .Where(x => x.Application_Blog.rss_Application.ID == 1)
    .Where(x => x.Blog_Category_ID == 1)
    .ToArray()
    .Select((x, index) => new
        {
            Index = index,
            Item = new MenuItem
            {
                Name = x.rss_Application_Blog.Blog_Title,
                Uri = x.rss_Application_Blog.Blog_Uri,
                ID = x.rss_Application_Blog.ID
            }
        });
    .GroupBy(i => i.Index / 4)
    .ToDictionary(g => g.Key);

生成的序列将如下所示:

items = new Dictionary<int, IGrouping<int>>()
{
    0, new[]
    {
        new { Index = 0, Item = new MenuItem { ... } },
        new { Index = 1, Item = new MenuItem { ... } }
    }
    1, new[]
    {
        new { Index = 2, Item = new MenuItem { ... } },
        new { Index = 3, Item = new MenuItem { ... } }
    }
};
于 2012-04-16T09:04:21.997 回答