如何查询缓存而不是实体?

时间:2011-04-22 17:03:42

标签: c# asp.net design-patterns entity-framework-4 appfabric

情景:

  1. CustomerEntity表示数据库中的Customer表。
  2. 有多个查询返回CustomerEntities(列表和单个客户)
  3. 如何可以“伪造”(代理?)CustomerEntity,以便所有查询都尝试命中缓存的CustomerEntities。显然,在每个查询中,我可以为每个单独的查询使用缓存模式,但我想将它用于整个Customer表而不管查询。

    (缓存预留)

        private static readonly DataCache cache = CacheUtil.Instance.Cache;
        public List<Customer> GetCustomers()
        {
            string cacheKey = "test";
            var list = (List<Customer>)cache.Get(cacheKey);
            if (list == null)
            {
                using (var context = DataObjectFactory.CreateContext())
                {
                    var customers = context.Customer.Where(w => w.CustomerId > 10).ToList();
    
                    list = new List<Customer>();
                    foreach (var customer in customers)
                        list.Add(customer);
                    cache.Put(cacheKey, list);
                    return list;
                }
            }
            else
            {
                return list;
            }
        }
    

1 个答案:

答案 0 :(得分:2)

这需要编写IObjectSet<T>的自定义实现,它将从缓存返回数据或查询真实的内部ObjectSet<T>。此实现的实例将在您的上下文中公开,而不是默认ObjectSet<T>。另一种更简单的方法是简单地隐藏您的上下文并仅通过GetQuery()之类的指定方法公开查询 - 您的所有查询都将使用此方法而不是context.Customer,因为context将无法访问它们。

您还可以查看Caching context wrapper