为什么投影在EF Core 2.0中不包括导航嵌套属性?

时间:2018-12-10 15:56:16

标签: c# ef-core-2.0

我有这些类型

public class Model
{
    public string Name { get; set; }

    public virtual List<Nested> Nested { get; set; }
}

public class Nested
{
    public Guid ModelId { get; set; }
    public virtual Model Model{ get; set; }

    public Guid FurtherNestedId{ get; set; }
    public virtual FurtherNested FurtherNested { get; set; }
}

public class FurtherNested
{
    public Guid Id {get; set;}
    public string Name{ get; set; }
}

我正在尝试使用它们来构建如下的视图模型:

_dbContext.Models.Include(x => x.Nested).ThenInclude(x => x.FurtherNested).Select(x => new {
    Nested= x.Nested
}).ToList();

由于某种原因,这会创建一个具有Nested属性的对象列表(如预期的那样),但是列表项的Nested属性设置了AnotherNestedId,但没有设置AnotherNested,因此我无法获取ExtraNested.Name。 IE AnotherNestedId存在,但实际的导航属性不存在。

但是我的数据上下文包含...

请问为什么?

编辑:同样值得注意的是,将toList()移到.Select()上方,我得到的正是我想要的,但是执行它需要3倍的时间。

编辑:我正在尝试获得如下内容:

{
    any other properties that live on Model,
    Nested: [
         furtherNestedId: '',
         furtherNested: { Name: '' }
    ]
}

1 个答案:

答案 0 :(得分:1)

  

包含不适用于投影查询。开始投影(选择)后,您需要一直向下进行选择。

所以尝试一下:

var myModels = _dbContext.Models.Include(x => x.Nested).ThenInclude(n => n.FurtherNested).Select(x => new
            {
                Name = x.Name,
                Nested = x.Nested.Select(n => new
                {
                    FurtherNestedId = n.FurtherNestedId,
                    FurtherNested = n.FurtherNested
                })

            }).ToList();

希望它会对您有所帮助。