我正在尝试从数据库加载大量记录,我想并行运行它们以加快速度。
下面是一些示例代码,它在尝试访问申请人属性时会中断,该属性为null。但是,在非并行循环中,Applicants属性要么已填充,要么是空列表,但永远不会为空。绝对启用了延迟加载。
var testList = new List<string>();
Context.Jobs
.AsParallel()
.WithDegreeOfParallelism(5)
.ForAll(
x => testList.Add(x.Applicants.Count().ToString())
);
我可以这样做吗?它与实体框架连接有关吗?我可以将它并行友好并将其实例传递给任务或其他东西吗?我只是在拍摄想法,但我真的没有线索。
编辑:
这篇文章与我的相关吗?我的问题听起来有点类似。 Entity Framework lazy loading doesn't work from other thread
答案 0 :(得分:2)
PLINQ没有提供并行化LINQ-to-SQL和LINQ-to-Entities查询的方法。因此,当您致电AsParallel
时,EF应首先实现查询。
此外,它没有任何意义来并行化在数据库上执行的查询,因为数据库可以自己做。
但是如果你想并行化cliend-side的东西,下面的代码可能会有所帮助:
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())
);