Fluent LINQ EF Core - Select 过滤子 属性

Fluent LINQ EF Core - Select filtered child property

我有以下 classes:

  public class User
    {
        public Guid Id { get; set; }
        public string Name { get; set; }
    }

    public class ParentEntity
    {
        public Guid Id { get; set; }

        public string SomeProperty { get; set; }

        public ICollection<ChildEntity> ChildEntities { get; set; }

    }

    public class ChildEntity
    {
        public Guid Id { get; set; }

        public int Vote { get; set; }

        public Guid UserId { get; set; }
    }

    public class ReturnedParentDto
    {
        public Guid Id { get; set; }
        public string SomeProperty { get; set; }
        public int Vote { get; set; }

    }

我希望能够returnParenEntities 的完整列表,但获取用户的 Id class (UserClassId),然后过滤 ParentEntity 的 ICollection,其中 UserUid = UserClassId,因此仅1 ChildEntity 总是 returned。然后我想从 returned ChildEntity 中提取一个特定字段并将其与 ParentEntity 字段合并。最终结果应该类似于 ReturnedParentDto.

我想做成

这样的风格
ParentEntities.Include(v => v.ChildEntities).ToList()

这在 EF Core 5 中似乎是可能的,但我的项目是在 3.1 中。

您可以按如下方式进行

方法一:

var result = result = parentEntities.Include(x => x.ChildEntities.Where(y => y.UserId == userId))
     .Select(x => new ReturnedParentDto {
          Id = x.Id,
          SomeProperty = x.SomeProperty,
          Vote = x.ChildEntities.FirstOrDefault()?.Vote // userId is the variable here
     });

方法二:

var result = parentEntities.Select(x => 
  new ReturnedParentDto {
      Id = x.Id,
      SomeProperty = x.SomeProperty,
      Vote = x.ChildEntities.FirstOrDefault(y => y.UserId == userId)?.Vote // userId is the variable here
 });