使用c#和实体框架,我希望按创建的天数返回结果,直到达到指定的限制。为了返回刚刚过去的一天,我有:
blogs.Where(a => a.Created >= DateTime.Now.Date);
其中博客属于IEnumerable<Blog>
类型。但我想让它一天一天地搜索,直到我得到10个结果,然后也知道到达的日期(或类似的日期)。
只是为了解释一下,这是一个页面上无限滚动的一部分,我希望页面按日期范围排列,而不是只取下一个10。这将有助于防止在用户向下滚动列表时输入新博客时出现任何问题。
不太确定如何进行,所以任何建议/想法都值得赞赏。
谢谢。
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);
如果我理解正确,您不希望每页显示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();
(这里可以为null的东西只是用来处理result
为空的情况。那么oldestDate
就是null
。)
如果您想将其作为数据库查询,即blogs
实际上是一个类似于context.Blogs
的DbSet<Blog>
,您可能需要对其进行一些重写,因为LINQ to Entities:不支持DateTime.Date
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();
您可以使用OrderBy按天对记录进行排序,并且通过使用Take()(采用int参数),您不能像这样限制记录:
blogs.OrderBy(a=>a.Created).Where(a => a.Created >= DateTime.Now.Date).Take(10);
我根据答案中的一些想法找到了我想要的答案。这与我提出的问题不完全匹配,但它解决了我概述的问题。
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天的日期,实际加载每个页面的内容。这解决了确保每个页面都返回一些博客的主要问题,每个页面都包含它所覆盖的日子里的所有博客,这让我可以轻松地获得下一页。
感谢所有回答的人。