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