使用c#和Entity Framework,我想按创建的日期返回结果,直到达到指定的限制。为了回到过去的一天,我有:
blogs.Where(a => a.Created >= DateTime.Now.Date);
博客的类型为IEnumerable<Blog>
。但我想这样做,以便它一次一天地搜索,直到我达到10个结果,然后也知道到达了什么日期(或类似的东西)。
只是为了解释一下,这是页面无限滚动的一部分,我希望页面按日期范围,而不是仅仅采用下一个10。这将有助于防止新博客出现任何问题在用户向下滚动列表时输入。
不确定如何继续这样做,所以任何建议/想法都会受到赞赏。
感谢。
答案 0 :(得分: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);
答案 1 :(得分: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
为空的情况。oldestDate
然后会null
。)
如果您希望将其作为数据库查询,即blogs
实际上是DbSet<Blog>
,例如context.Blogs
,您可能需要重写一下,因为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();
答案 2 :(得分:0)
你可以使用 OrderBy 按日排序记录,并使用带有int参数的Take(),你不能限制这样的记录:
blogs.OrderBy(a=>a.Created).Where(a => a.Created >= DateTime.Now.Date).Take(10);
答案 3 :(得分: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天的日期,实际上每个页面都有内容。这解决了确保每个页面返回一些博客的主要问题,每个页面包含所涵盖日期的所有博客,这使我可以轻松地获得下一页。
谢谢所有回答的人。