Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 并行查询实体框架打破了延迟加载_C#_Entity Framework_Parallel Processing - Fatal编程技术网

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

C# 并行查询实体框架打破了延迟加载,c#,entity-framework,parallel-processing,C#,Entity Framework,Parallel Processing,我正在尝试从数据库加载很多记录,我想并行运行它们以加快速度 下面是一些示例代码,当它试图访问申请者属性(为null)时会中断。但是,在非并行循环中,申请者属性要么填充,要么为空列表,但从不为null。肯定启用了延迟加载 var testList = new List<string>(); Context.Jobs .AsParallel() .WithDegreeOfParallelism(5)

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

下面是一些示例代码,当它试图访问申请者属性(为null)时会中断。但是,在非并行循环中,申请者属性要么填充,要么为空列表,但从不为null。肯定启用了延迟加载

var testList = new List<string>();

Context.Jobs
                .AsParallel()
                .WithDegreeOfParallelism(5)
                .ForAll(
                    x => testList.Add(x.Applicants.Count().ToString())
                );
var testList=newlist();
背景、工作
.天冬酰胺()
.平行度(5)
.福尔(
x=>testList.Add(x.applications.Count().ToString())
);
我可以这样做吗?它是否与实体框架连接相关?我可以使它并行友好,并将它的一个实例传递到任务或其他内容中吗?我只是想提出一些想法,但实际上我一点线索也没有

编辑:


这篇文章和我的有关吗?我的问题听起来有点类似

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

此外,并行化在数据库上执行的查询没有任何意义,因为数据库本身可以做到这一点

但如果您想并行cliend端的东西,下面的代码可能会有所帮助:

Context.Jobs
.Select(x => x.Applicants.Count().ToString())
.AsParallel()
.WithDegreeOfParallelism(5)
.ForAll(
           x => testList.Add(x)
       );
请注意,您只能在查询具体化之前访问导航属性。(在
aspallel()
call之前的情况下)。因此,请使用
选择
,以获得您想要的所有内容

Context.Jobs
.Select(x => new { Job = x, Applicants = x.Applicants })
.AsParallel()
.WithDegreeOfParallelism(5)
.ForAll(
       x => testList.Add(x.Applicants.Count().ToString())
   );
您还可以使用方法将导航属性包括到查询结果中

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

我不想让实际的DB查询并行。我很高兴调用Parallel.ForEach(Context.Jobs.ToList())…但我的问题是,当我试图从一个图表级别向下看求职者时,求职者是null@LivingOnACloud-EF的DbContext不是线程安全/可执行的,因此任何时候从未创建上下文的线程访问导航属性或DbSet时,都会得到null/异常。