Change DataContext of IQueryable

本文关键字:IQueryable of DataContext Change | 更新日期: 2023-09-27 17:54:04

我正在研究一个使用静态全局DataContext的项目(不建议这样做,但在这一点上很难更改)。我目前需要通过并行化一些独立的函数来提高某些部分的性能。因为DataContext不是线程安全的,所以我不能在新创建的线程中使用它。因此,我在每个线程中创建了一个新的DataContext,并在线程结束时将其处理掉。

新的数据上下文一切正常,但我有一个问题,该函数的一个输入是一个IQueryable,它附加到全局数据上下文。运行该方法将导致"已经有一个与此命令相关联的打开的数据读取器必须先关闭"的异常。

问题是,我如何能够运行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选项不幸是相当困难的,因为有大量的逻辑来生成它。将其转换为列表然后传递它也不是一个选项,因为查询返回数千个条目,并且会对性能产生负面影响。

任何帮助都是非常感谢的

Change DataContext of IQueryable

我还没有测试过这个,但是我认为可以工作的是让您的查询具有正确的Expression,但错误的Provider,并将其与具有正确的Provider,但错误的Expression相结合。为此,使用CreateQuery():

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