C# EntityFramework:无法在LINQ联接查询中包含嵌套成员

C# EntityFramework:无法在LINQ联接查询中包含嵌套成员,c#,entity-framework,linq,linq-to-entities,C#,Entity Framework,Linq,Linq To Entities,我正在尝试执行一个涉及嵌套成员的LINQ to实体查询。下面是实体模式。为了简洁起见,我将代码保持在最低限度 public class NAVSummary { public virtual IList<NAVStatus> Statuses { get; set; } } public class NAVStatus { [Key] [Column(Order = 0), ForeignKey("NAVSummary")] public strin

我正在尝试执行一个涉及嵌套成员的LINQ to实体查询。下面是实体模式。为了简洁起见,我将代码保持在最低限度

public class NAVSummary
{
    public virtual IList<NAVStatus> Statuses { get; set; }
}

public class NAVStatus
{
    [Key]
    [Column(Order = 0), ForeignKey("NAVSummary")]
    public string Portfolio { get; set; }
    [Key]
    [Column(Order = 1), ForeignKey("NAVSummary")]
    public DateTime ValueDate { get; set; }
    [Key, Column(Order = 3)]
    public int StatusId { get; set; }
    [JsonIgnore]
    public virtual NAVSummary NAVSummary { get; set; }
    [ForeignKey("StatusId")]
    public NAVStatusMaster StatusMaster { get; set; }
}

[Table("NAVRec_StatusMaster")]
public class NAVStatusMaster
{
    [Key]
    public int Id { get; set; }
    public string Description { get; set; }
}
上述查询将生成除NAVStatus.StatusMaster属性之外的所有内容。尽管我在查询开始时使用Include()扩展名包含了属性,公共NAVStatusMaster StatusMaster{get;set;}仍然为空

但是,当我执行下面的查询时,StatusMaster字段确实是从数据库记录中设置的

var statusResult = dbContext.NAVSummaries
                    .Include(n => n.Statuses)
                    .Include(n => n.Comments)
                    .Include(n => n.Statuses.Select(s => s.StatusMaster))
                    .Include(n => n.Extracts)
                    .Where(n => n.Statuses.Count > 0).First();

如果有人能帮我解决这个问题,我将不胜感激。

即时加载只适用于查询的最后一部分。如果在包含之后使用投影,则所有内容都会自动丢失。解决问题的唯一方法是将
StatusMaster
放在投影中:

.Select(s => new
{
   DayOverDayChange = s.outer.DifferencePercent - s.inner.DifferencePercent,
   IsChange = s.inner.DifferencePercent == s.outer.DifferencePercent ? false : true,
   Statuses = s.outer.Statuses,
   Statusmaster = s.outer.Statuses.SelectMany(s => s.StatusMaster)
                        }).Take(10).ToList();
但是,我认为您并不真正希望
StatusMaster
成为一个单独的列表。也许在select中的末尾包含您的内容是可行的:

.Select(s => new
{
   DayOverDayChange = s.outer.DifferencePercent - s.inner.DifferencePercent,
   IsChange = s.inner.DifferencePercent == s.outer.DifferencePercent ? false : true,
   Statuses = s.outer.Statuses.Include(s => s.StatusMaster),
                        }).Take(10).ToList();
我不确定这是否会起作用,也无法测试它,因为我必须去某个地方:)我认为最好的选择是将
StatusMaster
设置为虚拟以启用延迟加载

()

.Select(s => new
{
   DayOverDayChange = s.outer.DifferencePercent - s.inner.DifferencePercent,
   IsChange = s.inner.DifferencePercent == s.outer.DifferencePercent ? false : true,
   Statuses = s.outer.Statuses.Include(s => s.StatusMaster),
                        }).Take(10).ToList();