【问题标题】:Navigational Properties remaining null, even after filtering them out导航属性保持为空,即使在过滤掉它们之后也是如此
【发布时间】:2014-10-22 16:42:14
【问题描述】:

我在这里碰壁了,事情正在发生,它们似乎违反直觉。

我有一个实体集合,大约 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 的空引用,即使在这些应该被过滤掉之后也是如此。我错过了一些非常简单的东西吗?还是我做错了什么?

【问题讨论】:

  • 你确定不是Prop3 是空的吗?有什么例外?
  • 异常是Prop1上的空引用,这是不寻常的,因为Ent中的FK字段Prop1Key不为空。

标签: c# .net linq entity-framework linq-to-entities


【解决方案1】:

实体是 EntityFramework 上下文吗? Prop1、Prop2 和 Prop3 是导航属性吗?

如果是这种情况,您还需要加载它们。 您可以通过在 linq 查询中使用 DbSet 的 Include 方法(即刻加载)来执行此操作,使用 Load 方法稍后加载它们,或者您可以启用延迟加载,以便在您访问属性时加载这些导航属性。我个人更喜欢前两种方法,具体取决于用例。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多