Linq to sql NET 4的DataContext编译查询问题

Linq to sql NET 4的DataContext编译查询问题,linq-to-sql,.net-4.0,datacontext,linq.compiledquery,Linq To Sql,.net 4.0,Datacontext,Linq.compiledquery,我的项目(UI层是asp.mvc)是使用.NET3.5开发的。升级到.NET 4.0后,我遇到了编译查询的问题: [ArgumentException: Query was compiled for a different mapping source than the one associated with the specified DataContext.] System.Data.Linq.CompiledQuery.ExecuteQuery(DataContext contex

我的项目(UI层是asp.mvc)是使用.NET3.5开发的。升级到.NET 4.0后,我遇到了编译查询的问题:

 [ArgumentException: Query was compiled for a different mapping source than the one associated with the specified DataContext.]
   System.Data.Linq.CompiledQuery.ExecuteQuery(DataContext context, Object[] args) +863348
   System.Data.Linq.CompiledQuery.Invoke(TArg0 arg0, TArg1 arg1) +110
每次运行查询时,我都在传递上下文

return StaticQueries.getTopFiveOrders(mContext, int howMany);


public static Func<Mycontext, int, IQueryable<Order>> getTopFiveOrders
            = CompiledQuery.Compile
                ((Mycontext mContext, int howMany) =>
                 ( some query).Distinct());
返回StaticQueries.getTopFiveOrders(mContext,int howmount);
公共静态函数getTopFiveOrders
=CompiledQuery.Compile
((Mycontext mContext,int howmount)=>
(一些查询).Distinct());

错误发生在第二个请求上。

这是由于编译查询的操作方式发生了变化

现在需要始终使用相同的上下文运行它们

解释进行更改的原因:

本例中的问题是因为CompiledQuery要求所有执行都使用相同的映射源。在您用来重现问题的代码示例中,DataContext的不同实例每次都使用一个新的映射源,但查询无法报告这一点,只是默默地失败了。如果使用DataContext.Log属性或其他日志记录(如SQL Server Profiler),您将看到第二次更新甚至没有发送到服务器

在.NET Framework 4.0中已经修复了这一问题,因此报告的异常将包含类似“查询是为与指定DataContext关联的映射源不同的映射源编译的”这样的消息,并且它不会自动失败。但是,您提供的正在工作的代码是正确的方法,因为它对LinqTestDataContext的所有实例使用相同的静态映射源


基本上这一直是一个问题,但过去常常是无声地失败,他们只是在.NET4中明确地说明了失败。

我也面临类似的问题。我从编译的查询中删除了static,它工作得很好。尽管我还没有发现它对性能的影响有多大。

我花了大量的时间研究这个问题,以及.NET 4.0中的行为是如何改变的。我在这里的博客中更详细地介绍了我的发现:

粗略的情况是:微软做出了一个改变,以保护人们不做愚蠢的事情(在不同的映射之间重用编译查询),但似乎破坏了一个主要的性能优势(在相同映射的不同上下文之间重用编译查询,但映射的不同实例)

使用getter或作为类成员的CompiledQuery只会导致不断的重新编译,而不会带来真正的性能好处