如何在达到设定限制之前每天返回结果?

时间:2014-04-09 17:06:11

标签: c# pagination asp.net-mvc-5 entity-framework-6

使用c#和Entity Framework,我想按创建的日期返回结果,直到达到指定的限制。为了回到过去的一天,我有:

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

博客的类型为IEnumerable<Blog>。但我想这样做,以便它一次一天地搜索,直到我达到10个结果,然后也知道到达了什么日期(或类似的东西)。

只是为了解释一下,这是页面无限滚动的一部分,我希望页面按日期范围,而不是仅仅采用下一个10。这将有助于防止新博客出现任何问题在用户向下滚动列表时输入。

不确定如何继续这样做,所以任何建议/想法都会受到赞赏。

感谢。

4 个答案:

答案 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天的日期,实际上每个页面都有内容。这解决了确保每个页面返回一些博客的主要问题,每个页面包含所涵盖日期的所有博客,这使我可以轻松地获得下一页。

谢谢所有回答的人。