Linq to sql LINQ到SQL实体标识缓存和编译查询错误的解决方法?

Linq to sql LINQ到SQL实体标识缓存和编译查询错误的解决方法?,linq-to-sql,caching,identity,compiled,Linq To Sql,Caching,Identity,Compiled,我在LINQtoSQL中遇到了一个错误,在编译的查询中执行主键查询时,身份缓存不起作用 我编写了以下示例来演示身份缓存的使用。它在第一次命中数据库时只执行一次对数据库的调用,每次之后都从数据上下文的缓存中检索客户实体 for(int i=0; i<10; i++) { DataContext.GetTable<Customer>().Single(c=>c.Id == 1); } for(inti=0;ic.Id=1); } 不

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

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

    for(int i=0; i<10; i++)
    {
        DataContext.GetTable<Customer>().Single(c=>c.Id == 1);
    }
for(inti=0;ic.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));
for(int i=0;i context.GetTable().Single(c=>c.Id==Id));

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

看起来像一个bug-在这方面已经有了一些

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


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

我最终使用了一个肮脏的黑客来解决这个问题,通过使用反射来调用名为GetCachedEntity的linq实体对象的私有方法来强制利用缓存。我没有时间实现一个更干净的解决方案,但对于任何对此主题感兴趣的人,我建议在此场景中实现您自己的缓存机制。

编译这样一个小查询似乎很愚蠢,但我们的应用程序是一个服务器,它接受许多客户端请求,并且必须生成数百甚至数千个请求在这种情况下,您可能需要对它进行测量——如果解析此查询的开销比编译的查询路由更有效,我会感到惊讶。