如何使用 LINQ 和 EF Core 进行一对多

Posted

技术标签:

【中文标题】如何使用 LINQ 和 EF Core 进行一对多【英文标题】:How to do a 1 to many using LINQ and EF Core 【发布时间】:2021-08-20 13:30:56 【问题描述】:

在我的Place Repository中,即使Registration 表中没有记录,我也想为每个Place 带来所有Place 记录,包括任何Registration 记录。

目前我有:

public IEnumerable<Place> Places

   get
   
      return _appDbContext.Places.Include(r => r.Registrations.Where(q => q.PlaceId == r.Id));
   

导致以下错误:

InvalidOperationException: LINQ 表达式 'DbSet() .Where(r => EF.Property(EntityShaperExpression: EntityType: Place ValueBufferExpression: ProjectionBindingExpression: Outer.Outer.Outer.Outer.Outer.Outer.Outer.Outer IsNullable: False , "Id") != null && object.Equals(objA: (object)EF.Property(EntityShaperExpression: EntityType: Place ValueBufferExpression: ProjectionBindingExpression: Outer.Outer.Outer.Outer.Outer.Outer.Outer.Outer IsNullable: False, " Id"), objB: (object)EF.Property(r, "PlaceId"))) .Where(r => r.PlaceId == r.Id)' 无法翻译。以可翻译的形式重写查询,或通过插入对“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的调用显式切换到客户端评估。请参阅https://go.microsoft.com/fwlink/?linkid=2101038 了解更多信息。

模型:

public class Place

   private const int _annualFiguresDueWithinDays = 90;
   public int Id  get; set; 
   [Required(ErrorMessage = "Please enter in the Place's name.")]
   [MaxLength(100, ErrorMessage = "The maximum length for the place name is 100 characters.")]
   public string PlaceName  get; set; 
   public IEnumerable<Registration> Registrations  get; set; 


public class Registration

   public int Id  get; set; 
   [ForeignKey("PlaceId")]
   public int PlaceId  get; set; 
   public DateTime? RegistrationDate  get; set; 
   public bool IsFirstRegistration  get; set; 

【问题讨论】:

Include(r =&gt; r.Registrations) 就够了。 感谢 Mat J,这行得通。 【参考方案1】:

把include函数改成这个就行了

public IEnumerable<Place> Places

   get
   
      return _appDbContext.Places.Include(r => r.Registrations));
   

【讨论】:

EF 将从导航属性配置中生成正确的 SQL 连接过滤器约束。

以上是关于如何使用 LINQ 和 EF Core 进行一对多的主要内容,如果未能解决你的问题,请参考以下文章

EF CORE - 创建一对多地图

EF Core 多对多关系上的 LINQ 查询

EF Core SQLite 错误 19:尽管配置了一对多,但“外键约束失败”

EF Core中通过Fluent API配置一对多关系

如何在 EF Core 和 LINQ 中表达 GetDate() 和 DateAdd() 方法?

EF Core 5.0 添加多对多使得一对多无法确定