【问题标题】:.NET Entity Framework How to select records updated in the last 1 minute?.NET Entity Framework 如何选择最近 1 分钟内更新的记录?
【发布时间】:2017-02-27 11:25:22
【问题描述】:

我的应用程序的目的是根据标准检索记录。

问题是可能有数百万条记录,但我只想选择最近 1 分钟内更新的记录。

第一次选择所有记录,但一分钟后我无法再次选择所有记录,因为这需要很长时间。我只想选择在该时间间隔内更新的订单。

var records = context.Orders.Where(x => x.Category == "GAMING");

有什么我可以做的吗?订阅某种数据库事件?

【问题讨论】:

  • 你有“更新时间”栏吗?
  • @DanielA.White 不,我没有。
  • 如果是传统的 rdbms,在 Order 表中添加时间戳列,在其上创建索引,然后选择 where timestamp>=now()-1minute
  • @quetzalcoatl 我明白了。我会调查的。谢谢。
  • 如果使用Sql Server,请注意timestamp这个词,有一个时间戳类型,但它与时间无关。他们在以后的版本中将其重命名为rowversion,但为了向后兼容而保留了时间戳关键字。

标签: c# sql .net entity-framework


【解决方案1】:

最有效的方法是包含一个包含时间戳的日期时间列(ex.DateInserted),并根据其值进行过滤:

var minuteAgo = DateTime.Now.AddMinutes(-1);
var recordsThisMinute =  context.Orders.Where(x => x.DateInserted >= minuteAgo && x.Category == "GAMING");

但是,如果您希望在不接触表格的情况下产生相同的结果,您可以随时尝试以下操作:

//Assuming oldRecords is the variable in which
//you're storing the records you selected a minute ago
var recordsThisMinute = context.Orders.Where(x => x.Category == "GAMING").Except(oldRecords);

【讨论】:

  • 注意timestamp这个词如果使用Sql Server,有一个timestamp类型但它与时间无关。他们在以后的版本中将其重命名为rowversion,但为了向后兼容,保留了时间戳关键字。我会将您第一句话的措辞更改为“最有效的方法是包含一个包含时间戳的日期时间列”
【解决方案2】:

也许您可以在您的 DbContext 中使用 idOrder,datetime 的静态字典,在 SaveChanges 方法的重载中进行管理。

public static IEnumarable<Order> GetLastUpdatedOrder()
{
//Return dictionnay here
}
public override int SaveChanges()
{
    var updatedOrder = ChangeTracker.Entries<Order>().Where(o => o.State == EntityState.Modified).ToList();
    //Manage here Your dictionnary
    var i = base.SaveChanges();
    return i;
}

【讨论】:

    猜你喜欢
    • 2021-04-21
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 2014-11-11
    • 2018-03-21
    相关资源
    最近更新 更多