我试图从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())
);