在EF Core中选择包含的内容

4

我有一个实体看起来像这样(为了简洁,其中许多其他属性已被删除):

public class Tender
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string CreatorId { get; set; }
    [ForeignKey("CreatorId")]
    public virtual AppUser Creator { get; set; }
    public ICollection<TenderCircle> TenderCircles { get; set; } = new List<TenderCircle>();
}

TenderCircles 属性用于提供与另一个名为 Circle 的实体的多对多关系。 TenderCircle 实体如下所示:

public class TenderCircle
{
    public int TenderId { get; set; }
    [ForeignKey("TenderId")]
    public Tender Tender { get; set; }
    public int CircleId { get; set; }
    [ForeignKey("CircleId")]
    public Circle Circle { get; set; }
}

现在,我正在执行以下查询(为了简洁起见部分已删除,通常包括许多其他的IncludeThenInclude语句):

return _context.Tenders
               .Include(t => t.Creator)
               .Include(t => t.TenderCircles.Select(tc => new { CirlceId = tc.CircleId, TenderId = tc.TenderId }))
               .ToList();

但是,它根本不起作用。我想要实现的是,我只想从TenderCircle中获取TenderIdCircleId属性,而忽略实际的TenderCircle对象。有什么办法可以在 EF Core 中实现这一点吗?


你的项目使用的是哪个 .NET Core 版本? - TanvirArjel
1个回答

8

您需要按照以下方式编写查询:

return _context.Tenders.Select(t => new TenderViewModel
                       {
                          Id = t.Id,
                          Creator = t.Creator,
                          TenderCircles = t.TenderCircles.Select(tc => new TenderCircle { CirlceId =  tc.CircleId, TenderId = tc.TenderId }).ToList();
                       }).ToList();

接下来是TenderViewModel的代码:

public class TenderViewModel
{
   public int Id { get; set; }
   public AppUser Creator { get; set; }
   public List<TenderCircle> TenderCircles { get; set; }
}

这在我的情况下可能会变得非常繁琐,因为正如我上面所写的那样,还涉及许多其他的“Include”和“ThenInclude”语句。 - tinker
1
@tinker 嗯,这个解决方案可能是你需要的。因为当你写 select 时,你不需要 include,你正在告诉数据库要取什么。请注意,在执行 .ToList() 之前先执行 select。 - Vova Bilyachat
1
所以你需要选择所需的字段,就这样。 - Vivek Nuna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接