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
相关产品推荐
相关产品推荐

