使用linq到实体框架读取最近按日期插入的行

本文关键字:日期 插入 最近 读取 linq 实体 框架 使用 | 更新日期: 2023-09-27 18:15:33

我在我的db中有一个日志表,并希望仅获取那些最近根据列名RowCreateDate添加的记录,这就是我如何试图实现从db中带来行的记录,但我觉得可能有更好的方法来实现相同的。

using (var context = new DbEntities())
        {
            // get date
            var latestDate = context.Logs.Max(o => o.RowCreateDate);
            if(latestDate!=null)
            {
                lastDate = new DateTime(latestDate.Value.Year, latestDate.Value.Month, latestDate.Value.Day,00,00,00);
                logs = context.Logs.Where( o.RowCreateDate >= lastDate).ToList();
            }
        }

我需要知道我做得对还是有另一种更好的方式?

使用linq到实体框架读取最近按日期插入的行

还有一个选择:

context.Logs.Where(c => DbFunctions.TruncateTime(c.RowCreateDate) == DbFunctions.TruncateTime(context.Logs.Max(o => o.RowCreateDate)))

这显式地读起来像您想要的那样(获取所有date等于max date的行),并且也会导致一个查询(而不是您可能期望的两个)。

你不能简化这段代码,因为LINQ to Entities不支持TakeWhile方法。

可以使用

using (var context = new DbEntities())
{        
    // get date
    var latestDate = context.Logs.Max(o => o.RowCreateDate);
    if(latestDate!=null)
    {
        lastDate = new DateTime(latestDate.Value.Year, latestDate.Value.Month, latestDate.Value.Day,00,00,00);
        logs = context.Logs
            .OrderBy(o => o.RowCreateDate)
            .AsEnumerable()
            .TakeWhile(o => o.RowCreateDate >= lastDate);
    }
}

但是它从数据库中获取所有数据,这不是很好,我不建议这样做。

我认为这可以(如果我们假设你想获得前3个最近的记录):

var topDates = context.Logs.OrderByDescending(x=>x.RowCreateDate).Take(3)

首先,我认为你的代码很好。我看不出这两个查询有什么问题。但是如果你想简化它,你可以使用TruncateTime,像这样:

    IGrouping<DateTime?, Logs>  log =
        context.Logs.GroupBy(x => DbFunctions.TruncateTime(x.RowCreateDate))
            .OrderByDescending(x => x.Key).FirstOrDefault();

它将返回一个分组结果,其中包含RowCreateDate在最后一天创建的日志。