簡體   English   中英

如何使用LINQ將查詢結果返回到字典

[英]How to use LINQ to return a query result to a dictionary

我正在做一個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 >>中?

我懷疑您可以這樣做:

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 ,但這實際上是您想要的更接近的模型。

@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 { ... } }
    }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM