如何返回每天的结果,直到达到设定的限制



使用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.BlogsDbSet<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天的日期,实际加载每个页面的内容。这解决了确保每个页面都返回一些博客的主要问题,每个页面都包含它所覆盖的日子里的所有博客,这让我可以轻松地获得下一页。

感谢所有回答的人。

最新更新