更改 IQueryable 的 DataContext

Change DataContext of IQueryable

我正在开发一个使用静态全局 DataContext 的项目(不推荐,但目前很难更改)。我目前需要通过并行化一些独立的功能来提高某些部分的性能。由于 DataContext 不是线程安全的,我不能在新创建的线程中使用它。因此,我在每个线程中创建了一个新的DataContext,并在线程末尾处理。

新数据上下文一切正常,但我有一个问题,该函数的输入之一是附加到全局数据上下文的 IQueryable。 运行 该方法将导致异常 "There is already an open DataReader associated with this Command which must be closed first."

问题是,我如何才能 运行 使用新数据上下文而不是更改后的数据上下文的 IQueryable。

请在下面找到线程的示例代码:

var myQueryable = Global.DataContext.Customers.Where(a => a.Age <12);

ParallelLoopResult threads = Parallel.ForEach(groups, group =>
        {
            DataContext ctx = new DataContext(Const.ConnectionString);
            myFunction(myQueryable);
            ctx.Dispose();
        });

不幸的是,在线程内重写 myQueryable 的选项非常困难,因为生成它需要大量逻辑。将其转换为列表然后传递它也不是一个选项,因为查询 returns 数千个条目并且会对性能产生负面影响。

非常感谢任何帮助

我还没有测试过这个,但是 我认为 可以使用正确的 Expression 但错误的 Provider 和将它与正确的 Provider,但错误的 Expression 组合起来。为此,请使用 CreateQuery():

var contextQueryable = ctx.Customers;

var fixedQueryable = contextQueryable.Provider.CreateQuery<Customer>(myQueryable.Expression);