导航属性保持为空,即使在过滤掉它们之后也是如此

本文关键字:之后 过滤 属性 导航 | 更新日期: 2023-09-27 18:27:25

我在这里遇到了一堵砖墙,事情正在发生,它们似乎违反了直觉。

我有一个大约4万个实体的集合,我正在尝试将其转换为视图模型。我使用以下代码来完成此操作。

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的空引用。道具1,即使在这些应该被过滤掉之后。我是不是错过了一些简单的东西?或者我做错了什么?

导航属性保持为空,即使在过滤掉它们之后也是如此

实体是EntityFramework上下文吗?道具1、道具2和道具3是导航属性吗?

如果是这种情况,您还需要加载它们。可以通过在linq查询中使用DbSet的Include方法(急切加载),稍后使用Load方法加载它们,或者可以启用延迟加载,以便在访问属性时加载这些导航属性。根据使用情况,我个人更喜欢前两种方法。

此外,您还可以通过在linq查询的选择上创建视图模型来简化此代码。这样,您就不需要创建一个列表来迭代它……您甚至可以使用AsParallel来创建视图模型对象。