并行查询实体框架打破了延迟加载



我试图从DB加载很多记录,我想并行运行它们以加快速度。

下面是一些示例代码,当它试图访问为空的申请人属性时中断。然而,在非并行循环中,申请人属性要么被填充,要么是一个空列表,但永远不会为空。

var testList = new List<string>();
Context.Jobs
                .AsParallel()
                .WithDegreeOfParallelism(5)
                .ForAll(
                    x => testList.Add(x.Applicants.Count().ToString())
                );

我可以这样做吗?它是否与实体框架连接有关?我能不能让它对并行友好,并把它的一个实例传递给任务之类的?我只是随便说说我的想法,其实我一点头绪都没有。

编辑:

这篇文章和我的有关吗?我的问题听起来有点类似。实体框架延迟加载不能在其他线程中工作

PLINQ不提供并行化LINQ-to-SQL和LINQ-to-Entities查询的方法。因此,当您调用AsParallel时,EF应该首先实现查询。

此外,并行执行数据库上的查询没有任何意义,因为数据库可以自己执行。

但是如果你想并行化客户端的东西,下面的代码可能会有帮助:

Context.Jobs
.Select(x => x.Applicants.Count().ToString())
.AsParallel()
.WithDegreeOfParallelism(5)
.ForAll(
           x => testList.Add(x)
       );

注意,您只能在实现查询之前访问导航属性。(在AsParallel()呼叫之前)。所以使用Select来得到所有你想要的。

Context.Jobs
.Select(x => new { Job = x, Applicants = x.Applicants })
.AsParallel()
.WithDegreeOfParallelism(5)
.ForAll(
       x => testList.Add(x.Applicants.Count().ToString())
   );

您还可以使用Include方法将导航属性包含到查询结果中…

Context.Jobs
.Include("Applicants")
.AsParallel()
.WithDegreeOfParallelism(5)
.ForAll(
       x => testList.Add(x.Applicants.Count().ToString())
   );

最新更新