2017-02-14 21 views
2

在下面的代碼:Linq分組 - <k,v>我的'V'在哪裏?

var finalArticles = 
     from domainArticle in articlesFoundInDomain 

     join articleCategoryVersion in dbc.ArticlesCategoriesVersions 
      on domainArticle.ArticleID equals articleCategoryVersion.ArticleID 
     join articleCategory in dbc.ArticleCategories 
      on articleCategoryVersion.CategoryID equals articleCategory.CategoryID 

     where articleCategory.ParentID == 52 

     group articleCategory by articleCategory.CategoryID 
      into newArticleCategoryGroup 

據我所知,該組子句應該返回一個IEnumerable其中k是密鑰,在這種情況下類別ID。

我覺得我現在誤解了Linq,因爲我認爲每個'k'都應該有'v'中的文章列表,但我不明白這些機制或術語或其他。當我嘗試將此語句投影到一個新的匿名對象中時,我似乎沒有得到任何文章......他們在哪裏?

編輯: 好了,所以我有一塊正在工作的代碼,但不幸的是它的命中SQL服務器多次:

var articlesAssociatedWithKnowledgeTypes = 
       from categories in dbc.ArticleCategories 

       join categoryVersions in dbc.ArticlesCategoriesVersions 
        on categories.CategoryID equals categoryVersions.CategoryID 

       join articles in articlesFoundInGivenDomain 
        on categoryVersions.ArticleID equals articles.ArticleID 

       where categories.ParentID == 52 && articles.Version == categoryVersions.Version 

       select new 
       { 
        ArticleID = articles.ArticleID, 
        ArticleTitle = articles.Title, 
        ArticleVersion = articles.Version, 
        CategoryID = categories.CategoryID, 
        CategoryName = categories.Name 
       } into knowledgeTypesFlat 
       group knowledgeTypesFlat by new { knowledgeTypesFlat.CategoryID, knowledgeTypesFlat.CategoryName } into knowledgeTypesNested 
       select new 
       { 
        CategoryID = knowledgeTypesNested.Key.CategoryID, 
        CategoryName = knowledgeTypesNested.Key.CategoryName, 
        Articles = knowledgeTypesNested.ToList() 
       }; 

我認爲ToList()上的文章將排序那出來,但它沒有。但是,代碼的工作原理雖然我不確定這是否是最優的?

+2

'加入into'是不是一個加入,但羣組加入。這是一個加入和分組的組合 –

+0

你能展示你想如何投影你的第一個查詢? – octavioccl

+0

@Dennis_E沒什麼公平的,所以在我的第一個例子結束時,我需要'選擇'以獲得IEnumerable ,或者用戶InBetween指出IGroup ,其中K = Category和V = List與K相關的文章? – Jacques

回答

1

該分組返回IGrouping的枚舉。 IGrouping<K, V>本身實現IEnumerable<V>。將每個組視爲該組中所有成員的可枚舉數加上一個額外的屬性Key

+2

我確定它是'IGrouping ',它實現了'IEnumerable ',而不是'IGroup' –

+0

@inin我相信這對你來說很合理,但Linq對我來說是新鮮的。我使用另一個實例在Employees可以訪問的地方編輯我的帖子,但是當我循環查詢表達式的結果時,我得到了result.Department和result.Employees,這有點不明確。 「進」的兩種用法有何不同? – Jacques

+0

@RenéVogt是的,修正了它。謝謝。 – InBetween

0

在您的第一個查詢中,您顯示的是group by,第二個是group join,兩者都返回不同的結果。該組通過返回IEnumerable<IGrouping<TKey, TElement>>。爲了得到結果你期待,你可以按CategoryIdCategoryName和項目作爲我在下面:

var finalArticles = 
    from domainArticle in articlesFoundInDomain 
    join articleCategoryVersion in dbc.ArticlesCategoriesVersions 
     on domainArticle.ArticleID equals articleCategoryVersion.ArticleID 
    join articleCategory in dbc.ArticleCategories 
     on articleCategoryVersion.CategoryID equals articleCategory.CategoryID 
    where articleCategory.ParentID == 52 
    group articleCategory by new{ articleCategory.CategoryID,articleCategory.CategoryName} 
     into g 
    select new {CatId=g.Key.CategoryID, CatName=g.Key.CategoryName,Articles =g.ToList() }; 

當你需要的分組元素可以撥打ToListToArray正如我上面

+0

@octaviocci我其實昨天試過這個。有趣的是,如果我循環訪問匿名類型的文章,我不會收到文章。我似乎找回了一個類別加上一個額外的屬性「article.ArticlesCategoriesVersions」,其類型爲EntitySet 。 – Jacques

0

沒有你finalArticles查詢結果爲IEnumerable<IGrouping<int, Article>>(假設CategoryIDint,您的文章類型爲Article)。

這些IGrouping<int, Article>提供int類型(的Key財產您CategoryID,也是IEnumerable<Article>代表的物品爲CategoryID序列。

你可以把這個例如到Dictionary<int, List<Article>>映射CategoryID s到的物品清單:

var dictionary = finalArticles.ToDictionary(group => group.Key, group => group.ToList()); 

或類別的列表包含文章:

您的評論後
var categories = finalArticles.Select(group => new { 
       CategoryID = group.Key, 
       Articles = group.ToList()}).ToList(); 

更新:

var finalArticles = 
     from domainArticle in articlesFoundInDomain 
     join articleCategoryVersion in dbc.ArticlesCategoriesVersions 
      on domainArticle.ArticleID equals articleCategoryVersion.ArticleID 
     join articleCategory in dbc.ArticleCategories 
      on articleCategoryVersion.CategoryID equals articleCategory.CategoryID 

     where articleCategory.ParentID == 52 

     group articleCategory by new {articleCategory.CategoryID, articleCategory.Name} 
     into newArticleCategoryGroup 
     select new 
     { 
      CategoryID = newArticleCategoryGroup.Key.CategoryID, 
      CategoryName = newArticleCategoryGroup.Key.Name, 
      Articles = newArticleCateGroup.ToList() 
     } 
+0

我需要分類ID和名稱以及文章列表。它看起來像你正在使用擴展方法,可以不直接添加到我的查詢表達式? – Jacques

+0

@Jacques更新了我的答案。我對查詢語法沒有太多經驗,更經常使用方法語法。請注意,查詢語法只是方法語法的_subset_,並被編譯器翻譯成方法。 –

相關問題