Entity Framework - 运行 对 cloned/cached 数据库集的查询

Entity Framework - running queries on a cloned/cached DBset

我正在使用继承自 System.Data.Entity.DbContext 的上下文对象:

public class MyDbContext : DbContext
{
    public MyDbContext()
    {
        Database.SetInitializer<MyDbContext>(null);
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new MyObjectConfiguration());
    }

    public DbSet<MyObjectClass> MyObject{ get; set; }
}

这是我使用 dbset:

的代码
using (var context = new MyDbContext())
{
    IQueryable<MyObjectClass> myQueryable = context.MyObject();
}

我想在 myQueryable 上 运行 查询,但我不希望它在数据库本身上 运行 - 我希望它在本地 运行缓存一个(每XXX次刷新一次)。

实现该目标的最佳方法是什么?

您可以使用 context.MyObject.Local,但它是 IEnumerable。

为保持简单,您可以对上下文的使用方式进行小幅调整。

public void Main () 
{
    // Cached collection...
    IQueryable<ItemClass> items;
    
    using ( context = _factory.CreateContext () ) 
    {
        items = context.Set<ItemClass> ()
            // Don't track the items returned by this query.
            .AsNoTracking()
            
            // Select all items.
            .Select ( e => true )
            
            // This will create a HashSet and populate it with the query results.
            .ToHashSet ()
            
            // Cast HashSet to IQueryable 
            .AsQueryable ();
    } // context gets disposed but we can still query the HashSet we created.
    
    // items is still in scope query it without making additional database queries.     
}

根据您的目标和相关数据量,您还可以考虑定期将数据同步到内存数据库之类的东西,以便您的应用程序可以 运行 针对内存副本进行一般查询。 (快速)如果数据跟踪最后修改的时间戳,后台进程可以运行保持两个数据源之间的变化同步。

从那里我会通过对缓存数据副本的整合检查来支持这一点,以报告任何可能不同步的数据,并有一个过程来记录增量异常并强制刷新整个缓存。