C# EntityFramework:无法在LINQ联接查询中包含嵌套成员
我正在尝试执行一个涉及嵌套成员的LINQ to实体查询。下面是实体模式。为了简洁起见,我将代码保持在最低限度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
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();