【问题标题】:I implemented caching in my WebPages site, but I don't think it's working我在我的网页站点中实现了缓存,但我认为它不起作用
【发布时间】:2012-10-28 12:50:08
【问题描述】:

编辑:

有没有办法监控缓存?


我决定实施缓存来提高产品页面的性能。目前,每个产品页面至少包含 3000 个条目。

使用缓存,这应该会大大缩短这些页面的加载时间。但我不确定我的实现是否有效,因为我已经在数据库中添加了新记录,并且这些更改会反映在浏览器中。

任何想法为什么缓存不起作用?

public class Acquire
{
    public class All
    {
        public WebGrid Products(String Range, String Category)
        {
            String cacheItemKey = Range + Category;
            bool cacheHit = true;
            Grid = WebCache.Get(cacheItemKey);

            if (Grid == null)
                cacheHit = false;

            if (cacheHit == false)
            {
                results = database.Products.Where(
                                   x => x.Range == Range && x.Category == Category);

                Grid = new WebGrid(results, canPage: false);

                // Add it to the Cache.
                WebCache.Set(cacheItemKey, Grid, 1, false);
            }

            return Grid;
        }
    }
}

如果您想知道为什么它包含在类和方法中;主要是为了保持页面美观整洁,减少代码重复,防止出错。

【问题讨论】:

    标签: c# .net caching razor webmatrix


    【解决方案1】:

    您需要确保缓存的是查询结果,而不是查询本身。即确保您枚举查询。最简单的方法是使用 结果.ToList()

    编辑: 这就是我的意思。

    results = database.Products.Where(
        x => x.Range == Range 
        && x.Category == Category).ToList();
    

    您可以通过在代码中设置断点来监控缓存,并检查您是否曾从WebCache.Get(cacheItemKey) 获得非空值。

    【讨论】:

    • 啊,编译器不喜欢那样。说MyModel.Product 不包含ToList() 的定义。
    • 嗯,代码在我的问题中。其余的代码只是grid.getHtml(...),该代码没有任何问题,因为它已经工作了几个月并且没有更改。
    • @JamesKent 是 database.Products.Where(...) 不是 LINQ?是自定义方法吗?我假设 database.Products 是一些 IEnumerable<Product> 并且您的结果也是一些 IEnumerable<Product> 肯定有一个 ToList() 方法(在 System.Linq 命名空间中)。
    • 呃,database.Products.Where 部分是实体框架的一部分。
    • @JamesKent 那么你的database.Products.Where返回什么类型?
    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 2011-02-26
    • 2018-11-06
    • 2015-07-13
    • 2011-05-19
    • 2015-05-05
    • 1970-01-01
    相关资源
    最近更新 更多