2011-03-31 60 views
0

我有兩個表格:類別和文章。一個類別可以有很多文章。我想要顯示按類別分類的新文章的概述。但是我想只顯示每個類別的前五篇文章。我應該如何編寫查詢來解決這個問題?使用Take to包含實體

我的第一個想法是這樣的:

var cat = from c in ctx.categories 
      where c.IsPublic == true 
      select c; 

但是,這包含了所有的文章,我不知道如何寫類似c.articles.Take(5)進行查詢。可能嗎?

哦,它是帶有實體框架的ASP.NET MVC 2。

回答

2

這對我有效。這裏重要的是要關閉延遲加載,以避免當您通過訪問集合所有的物品裝載:

ctx.ContextOptions.LazyLoadingEnabled = false; // assuming you are in EF 4.0 

var query = ctx.categories 
    .Where(c => c.IsPublic) 
    .Select(c => new { 
     Category = c, 
     Articles = c.Articles.Take(5) 
    }).ToList().Select(x => x.Category); 

foreach (var category in query) 
{ 
    foreach (var article in category.Articles) 
    { 
     // runs only 5 times through this loop 
    } 
} 

編輯

如果不處理ctx與上下文更長時間工作上述代碼段中,你可能會更好重新啓用懶加載再次...

ctx.ContextOptions.LazyLoadingEnabled = true; 

...你與其他查詢的麻煩之前,如果您的應用程序主要依靠懶LOA丁。

0
ctx.categories 
    .Where(c => c.IsPublic) 
    .Select(c => new 
    { 
     Category = c, 
     Articles = c.Articles.OrderBy(a => a.Whatever).Take(5) 
    ).Select(c => c.Category); 

假設你的類名是叫文章的EntityCollection範疇,這應該工作。

+0

這是行不通的。或者我沒有正確使用它。我使用了兩個嵌套的foreach循環。首先遍歷類別,然後遍歷category.Articles。這是正確的方法嗎? – 2011-03-31 19:55:27

+0

我相信最後一次選擇將放棄文章的急切加載。嘗試在最後一個投影之前插入一個執行查詢的「貪婪」操作,所以將最後一行改爲:'...)。ToList()。Select(c => c.Category);' – Slauma 2011-03-31 20:03:48

+0

不。返回一切,而不僅僅是五篇文章。 – 2011-03-31 20:16:32