4

我遇到了 linq to sql 中的一个错误,其中在编译查询中执行主键查询时身份缓存不起作用。

我编写了以下示例来演示身份缓存的用法。它只在第一次命中时对数据库执行一次调用,之后每次都从数据上下文的缓存中检索客户实体。

    for(int i=0; i<10; i++)
    {
        DataContext.GetTable<Customer>().Single(c=>c.Id == 1);
    }

不幸的是,当我将上述示例转换为已编译查询时,它无法利用身份缓存,实际上对数据库执行了 10 次调用。

    for(int i=0; i<10; i++)
    {
        RetrieveCustomer(DataContext, 1);
    }

    private static readonly Func<DataContext, int, Customer> RetrieveCustomer =
    CompiledQuery.Compile((DataContext context, int id) => context.GetTable<Customer>().Single(c=>c.Id == id));

有没有其他人遇到过这个问题并为此创建了解决方法?对于基于服务器的应用程序来说,利用编译查询和身份缓存非常重要,所以我希望这是其他人以前解决过的问题!

4

2 回答 2

2

看起来像一个错误 - 这个区域有一个数字。

作为一种解决方法,我不会为这样一个小/简单的操作创建编译查询 - 编译查询的真正好处是对于需要大量时间处理成 TSQL 的大型查询。

更新:这是一个错误,已解决,无法修复。

于 2009-10-08T15:48:21.663 回答
1

我最终使用了一个肮脏的技巧来解决这个问题,方法是使用反射调用一个名为 GetCachedEntity 的 linq 实体对象的私有方法来强制利用缓存。我没有时间实现更清洁的解决方案,但对于任何对此主题感兴趣的人,我建议您为这种情况实现自己的缓存机制。

于 2009-10-09T14:19:40.517 回答