1

我正在尝试从数据库中加载大量记录,并且我想并行运行它们以加快速度。

下面是一些示例代码,当它尝试访问为空的申请人属性时会中断。但是,在非并行循环中,申请人属性要么被填充,要么是一个空列表,但永远不会为空。延迟加载肯定是启用的。

var testList = new List<string>();

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

我可以做这样的事情吗?和实体框架连接有关系吗?我可以让它并行友好并将它的一个实例传递给任务或其他东西吗?我只是想出一些想法,但我真的一点头绪都没有。

编辑:

这个帖子和我的有关系吗?我的问题听起来有点相似。实体框架延迟加载在其他线程中不起作用

4

1 回答 1

2

PLINQ 不提供并行化 LINQ-to-SQL 和 LINQ-to-Entities 查询的方法。所以当你调用AsParallelEF 时应该首先实现查询。

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

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

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())
   );
于 2013-01-19T20:06:07.577 回答