2014-04-09 48 views
0

使用c#和實體框架,我想返回結果的日期創建,直到達到指定的限制。要返回剛剛過去的一天,我有:如何返回每天的結果,直到達到設定限制?

blogs.Where(a => a.Created >= DateTime.Now.Date); 

哪裏博客是IEnumerable<Blog>類型。但是我希望這樣做是爲了讓它一天一次地回頭看看,直到我達到10個結果,然後才知道到達了什麼日期(或類似的東西)。

只是爲了解釋,這是一個頁面上的無限滾動的一部分,我希望頁面按日期範圍,而不是僅僅採取下一個10。這將有助於防止任何新博客的問題在用戶向下滾動列表時輸入。

不知道如何繼續這個,所以任何建議/想法表示讚賞。

謝謝。

+0

只是爲了澄清這是10個結果我正在尋找10天的價值。而且,它不一定非得是10個結果。也許10應該是最低金額。我會每天做每一頁,但一天可能沒有任何結果,或者可能有很多。謝謝。 – AndrewPolland

回答

1

如果我理解正確的話,你不希望每頁顯示10名的博客,但已在10天內創建的所有博客。然後,你可以嘗試此查詢:

int page = 1;   // the page you want to display, 1, 2, 3, ... 
int daysPerPage = 10; 

List<Blog> result = blogs 
    .GroupBy(b => b.Created.Date)  // group blogs by day 
    .OrderByDescending(g => g.Key)  // sort the day groups descending by day 
    .Skip((page - 1) * daysPerPage) // skip the pages before requested page 
    .Take(daysPerPage)     // take the next 10 day groups 
    .SelectMany(g => g)    // get all blogs of 10 days in flat list 
    .OrderByDescending(b => b.Created) // sort blogs descending by blog date+time 
    .ToList();       // make a list with the result 

所顯示的最早日期可以發現:

DateTime? oldestDate = result 
    .Select(b => (DateTime?)b.Created.Date) 
    .LastOrDefault(); 

(可空的東西是隻能在這裏對付那result是空的情況下oldestDatenull即可。)

如果您要使用這個數據庫查詢,即blogs實際上是一個DbSet<Blog>context.Blogs,你可能要重寫它AB因爲DateTime.Date不支持使用LINQ到實體:

List<Blog> result = context.Blogs 
    .GroupBy(b => new { b.Created.Year, b.Created.Month, b.Created.Day }) 
    .OrderByDescending(g => g.Key.Year) 
    .ThenByDescending(g => g.Key.Month) 
    .ThenByDescending(g => g.Key.Day) 
    .Skip((page - 1) * daysPerPage) 
    .Take(daysPerPage) 
    .SelectMany(g => g) 
    .OrderByDescending(b => b.Created) 
    .ToList(); 
+0

謝謝,但這是我需要的帖子數量,而不是幾天。不能保證過去10天會有任何博客返回,但是多返回一天可能會有9天。所以我想要的是每天繼續搜索,直到我有一些結果要顯示。 – AndrewPolland

+0

@AndrewPolland:如果一天中沒有博客,那麼這一天不會計入10天,因爲這一天沒有組(GroupBy)。或換句話說:上述查詢中提取的10天內至少有1個博客*。所以,你總是至少有10個博客。但是,如果10天中的每一天都會有5個博客,您將獲得50個博客。 – Slauma

+0

對不起。說實話,我沒有正確地閱讀你的答案後,我讀了第一行,聽起來像你有錯誤的想法。現在我已經看好它了,我可以看到你幾乎給了我所需要的答案。謝謝,抱歉沒有正確閱讀。 – AndrewPolland

0

您可以使用排序依據到白天通過採取(),它採用的int參數記錄進行排序,你不能限制的記錄是這樣的:

blogs.OrderBy(a=>a.Created).Where(a => a.Created >= DateTime.Now.Date).Take(10); 
+0

讓我編輯它.. –

+0

實際上,由於'Created'是'DateTime',因此每個組中只有1個項目。 –

+0

嗯,對,在這​​種情況下,group by將不會完成這項工作。:/ –

3

IEnumerable<T>.Take(int count)將限制由返回結果的數量提供的計數。

試試這個:

// First, Limit by 10 
var result = blogs 
    .OrderByDescending(a => a.Created) 
    .Where(a => a.Created >= DateTime.Now.Date).Take(10); 

// Get last max date: 
var lastDate = result.Max(a => a.Created); 

// Subsequent, Limit by 10 
var subsequentResult = blogs 
    .OrderByDescending(a => a.Created) 
    .Where(a => a.Created >= lastDate).Take(10); 

lastDate = subsequentResult.Max(a => a.Created); 
+0

可能必須使用'OrderByDescending'來獲取最新的日期。 –

+0

@GrantWinney好的電話,我編輯了我的答案。 – Khan

0

我發現我一直在尋找基於從回答一些想法的答案。這與我提出的問題並不完全一致,但它解決了我列出的問題。

int page = 1; 
int NumOfDays = 3; 
blogs = blogs.GroupBy(a => a.Created.Date).Skip((page - 1) * NumOfDays).Take(NumOfDays).SelectMany(a=>a.Select(b=>b)); 

這將根據日期進行分組,然後花費3天的實際包含每個頁面加載的內容的日期。這解決了確保每個頁面返回一些博客的主要問題,每個頁面包含所涵蓋日期的所有博客,並且使我可以輕鬆獲得下一頁。

謝謝大家誰回答。

相關問題