我在这里撞墙,事情正在发生,而且看起来很反直。
我有一组实体,大约40k,我试图将其转换为视图模型。 我使用以下代码来执行此操作。
var ents= (from ent in entities.ents
where ent != null && ent.Prop1 != null && ent.Prop2 != null
select ent).ToList();
ConcurrentBag<VmEnt> filtered = new ConcurrentBag<VmEnt>();
Parallel.ForEach(ents.AsParallel(), ent =>
{
var vm = new VmEnt
{
Name = ent.Name,
Prop1 = new VmProp1
{
Id = ent.Prop1.Id,
Name = ent.Prop1.Name,
},
Prop2= new VmProp2
{
Id = ent.Prop2.Id,
Images = ent.Prop2.Images.Select(y => y.ImageUrl).ToList()
},
Prop3= ent.Prop3.Select(y => new VmProp3
{
Id = y.Id,
Name = y.Name
},
};
filtered.Add(vm);
});
我遇到的问题是在并行循环中有ent.Prop1的空引用,即使这些引用已被过滤掉了。我错过了一些非常简单的事吗?或者我做错了什么?
答案 0 :(得分:0)
实体是EntityFramework上下文吗? Prop1,Prop2和Prop3是导航属性吗?
如果是这种情况,您还需要加载它们。 您可以通过在linq查询(eager loading)中使用DbSet的Include方法,使用Load方法稍后加载它们来执行此操作,也可以启用延迟加载,以便在访问属性时加载这些导航属性。我个人更喜欢前两种方法,具体取决于用例。
此外,您可以通过在linq查询的选择上创建视图模型来简化此代码。这样你就不需要创建一个列表来迭代它......你甚至可以使用AsParallel来创建视图模型对象。