首页 > 解决方案 > 如何使用 LINQ 和 EF Core 进行一对多

问题描述

在我的Place Repository中,我想带上所有Place记录,包括Registration每个记录的任何记录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”的调用显式切换到客户端评估。了解更多信息。

该模型:

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

标签: c#linqasp.net-core-5.0ef-core-5.0

解决方案


只需将包含功能更改为此

public IEnumerable<Place> Places
{
   get
   {
      return _appDbContext.Places.Include(r => r.Registrations));
   }
}

推荐阅读