并行查询实体框架会破坏延迟加载

时间:2013-01-19 19:30:54

标签: c# entity-framework parallel-processing

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

下面是一些示例代码,它在尝试访问申请人属性时会中断,该属性为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

1 个答案:

答案 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())
   );