You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Entity Framework Core中如何在Include内过滤可选关联模型?

解决方法

针对你的问题,这里有几种无需给关联添加required就能消除警告的方案:

方案1:在模型构造函数中初始化空集合

虽然Shifts是可选关联,但可以在类的构造函数里默认初始化一个空集合,这样编译器就不会认为它可能为null,同时不影响关联的可选性(空集合代表没有关联数据):

public class MachineSchedule
{
    public int MachineScheduleId { get; set; }
    public string Name { get; set; } // 补充原代码中遗漏的get/set访问器

    #region Relationships

    public virtual ICollection<Shift>? Shifts { get; set; } = new List<Shift>();

    #endregion
}

修改后,原查询代码的警告会自动消失,EF Core在加载数据时,没有关联的Shift会保持空集合状态。

方案2:在Include中使用空合并运算符兜底

如果不想修改模型类,可以在查询中通过空合并运算符,给可能为null的Shifts提供一个空集合作为备选,避免编译器的null警告:

machineScheduleDto = _context.MachineSchedules
    .AsNoTracking()
    .Include(m => m.Shifts?.Where(s => s.Type == 1) ?? Enumerable.Empty<Shift>());

?.运算符确保当Shifts为null时不会调用Where,?? Enumerable.Empty<Shift>()则给编译器一个非null的集合源,消除警告。

方案3:使用null包容运算符(!)

如果你确定EF Core在执行查询时不会让Shifts为null(比如EF Core内部会自动初始化关联集合),可以使用null包容运算符告诉编译器忽略null警告:

machineScheduleDto = _context.MachineSchedules
    .AsNoTracking()
    .Include(m => m.Shifts!.Where(s => s.Type == 1));

这种方式最简单,但要注意:如果Shifts确实为null(比如手动实例化MachineSchedule而未初始化Shifts),运行时可能会抛出NullReferenceException,所以仅在你能确保查询场景中Shifts不会为null时使用。

内容的提问来源于stack exchange,提问作者guirms

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 17:02:11