我正在研究一个MVC项目。我需要返回一个对象,该对象将菜单项分组为四个组,以使用foreach迭代在视图中显示。由于这是传递给视图的模型,我需要返回一个可以绑定在.cshtml上的非泛型集合类。
我的想法是我可以根据LINQ中的某种计数类型对列表进行分组,以便为每个Dictionary键添加四个新的List项。但是,我还没有找到足以满足词典的表达式。我可以通过创建另一个方法并在集合中再次迭代来根据计数分配键来解决这个问题,但这似乎是不必要的迭代和不好的做法。
目前,我正在使用以下查询。
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>>?
答案 0 :(得分: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
});
请注意,这会返回Lookup
而不是Dictionary
,但这实际上是您想要的更接近的模型。
答案 1 :(得分: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 { ... } }
}
};