【问题标题】:EntityFramework : Unable to include nested member in LINQ join queryEntityFramework:无法在 LINQ 连接查询中包含嵌套成员
【发布时间】:2016-02-11 17:37:30
【问题描述】:

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

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; }
}

DbContext 具有所有上述实体的 DbSet。

我有以下 LINQ 查询:

var navSummariesTemp = dbContext.NAVSummaries
                            .Include(n => n.Statuses)
                            .Include(n => n.Comments)
                            .Include(n => n.Statuses.Select(s => s.StatusMaster))
                            .Include(n => n.Extracts)

                            .Join(dbContext.NAVSummaries,
                            current => new
                            {
                                current.Portfolio,
                                PD = SqlFunctions.DatePart("dw", current.ValueDate) == 2 ? DbFunctions.AddDays(current.ValueDate, -3).Value :
                                        SqlFunctions.DatePart("dw", current.ValueDate) == 1 ? DbFunctions.AddDays(current.ValueDate, -2).Value :
                                                                                            DbFunctions.AddDays(current.ValueDate, -1).Value
                            },
                            previous => new { previous.Portfolio, PD = previous.ValueDate },
                                                (outer, inner) => new { outer, inner })
                            .Where(w => w.outer.Statuses.Count > 0)
                            .Select(s => new
                            {
                                DayOverDayChange = s.outer.DifferencePercent - s.inner.DifferencePercent,
                                IsChange = s.inner.DifferencePercent == s.outer.DifferencePercent ? false : true,
                                Statuses = s.outer.Statuses
                            }).Take(10).ToList();

上述查询产生除 NAVStatus.StatusMaster 属性之外的所有内容。虽然我使用 Include() 扩展在查询开始时包含了该属性,但 public NAVStatusMaster StatusMaster { get;放; } 仍然是 null

但是,当我执行以下查询时,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();

如果有人能帮我解决这个问题,我真的很感激。

【问题讨论】:

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


    【解决方案1】:

    急切加载仅适用于查询的最后一部分。如果在包含后使用投影,一切都会悄然丢失。解决您的问题的唯一方法是专门将 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(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 虚拟以启用延迟加载。

    (See this link)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多