Linq to sql 如果超过大约100毫秒,那么问题几乎肯定是在数据库方面。在查询的列上可能没有相应的索引。如果希望缓存而不是处理DB perf问题,则需要缓存特定查询的结果,这可以通过将它们键入用于创建查询的参数来实现。例如(C#): IEnumerable GetBatch(日期时间开始日期、日期时间结束日期、, 小数金额) { string cacheKey=string.Format(“GetBatches-{0}-{1}-{2}”, 开始日期、结束日期、金额); IEnumerable results=Cache[cacheKey]; 如果(结果!=null) { 返回结果; } 结果=.ToList(); 添加(cacheKey,results,…); 返回结果; }

Linq to sql 如果超过大约100毫秒,那么问题几乎肯定是在数据库方面。在查询的列上可能没有相应的索引。如果希望缓存而不是处理DB perf问题,则需要缓存特定查询的结果,这可以通过将它们键入用于创建查询的参数来实现。例如(C#): IEnumerable GetBatch(日期时间开始日期、日期时间结束日期、, 小数金额) { string cacheKey=string.Format(“GetBatches-{0}-{1}-{2}”, 开始日期、结束日期、金额); IEnumerable results=Cache[cacheKey]; 如果(结果!=null) { 返回结果; } 结果=.ToList(); 添加(cacheKey,results,…); 返回结果; },linq-to-sql,caching,Linq To Sql,Caching,只要当项目在缓存中时结果不能更改,或者如果您不关心得到过时的结果,这就可以了。如果这是一个问题,那么它开始变得更加复杂,我不会在这里讨论所有的细节 底线是,“缓存”表中的每一条记录根本不是缓存,而是将一个高效的关系数据库(SQL Server)变成一个草率、低效的内存数据库(缓存中的通用列表)。不要缓存表,如果需要,请缓存查询。在您决定这样做之前,请尝试解决数据库本身的性能问题 作为记录,我还应该注意到,似乎有人实现了一种缓存形式。我还没有测试过这种方法,我不确定在实践中使用它会比上面的方法容易

只要当项目在缓存中时结果不能更改,或者如果您不关心得到过时的结果,这就可以了。如果这是一个问题,那么它开始变得更加复杂,我不会在这里讨论所有的细节

底线是,“缓存”表中的每一条记录根本不是缓存,而是将一个高效的关系数据库(SQL Server)变成一个草率、低效的内存数据库(缓存中的通用列表)。不要缓存表,如果需要,请缓存查询。在您决定这样做之前,请尝试解决数据库本身的性能问题


作为记录,我还应该注意到,似乎有人实现了一种缓存形式。我还没有测试过这种方法,我不确定在实践中使用它会比上面的方法容易多少(您仍然需要特别选择使用它,它不是自动的),但我将它列为一种可能的替代方法。

谢谢!这就澄清并解释了很多关于LINQ的简单英语缓存…(该死的MSDN!)。在对数据库做了更多的阅读之后,我相信你对索引的看法是正确的。。。再次感谢!!!非常感谢。这就澄清并解释了很多关于LINQ的简单英语缓存…(该死的MSDN!)。在对数据库做了更多的阅读之后,我相信你对索引的看法是正确的。。。再次感谢!!!
Dim b =  From r In db.batches _
                    Where r.TotalDeposit = amount _
                    And r.bDate > startDate AndAlso r.bDate < endDate _
                    Select r
    Dim t As New List(Of batch)
    Dim cachedBatch = From d In db.batches _
           Select d
    t = From r In cachedBatch _
                    Where r.TotalDeposit = amount _
                    And r.bDate > startDate AndAlso r.bDate < endDate _
                    Select r
    Return t
IEnumerable<Batch> GetBatches(DateTime startDate, DateTime endDate,
    Decimal amount)
{
    string cacheKey = string.Format("GetBatches-{0}-{1}-{2}",
        startDate, endDate, amount);
    IEnumerable<Batch> results = Cache[cacheKey];
    if (results != null)
    {
        return results;
    }
    results = <LINQ QUERY HERE>.ToList();
    Cache.Add(cacheKey, results, ...);
    return results;
}