使用 LINQ 查询 EF Core 中的复杂数据类型

Querying complex data types in EF Core with LINQ

我正在使用 EF Core 和 ASP.NET Core API,我的实体大致定义如下:

public class MyUser : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Circle
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<MyUser> Members { get; set; } = new List<MyUser>();
}

public class Tender
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string Name { get; set; }
    public TenderVisibility Visibility { get; set; }
    public ICollection<TenderCircle> TenderCircles { get; set; } = new List<TenderCircle>();
}

public enum TenderVisibility
{
    Public,
    Circles,
}

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

然后,如果可见性设置为 Circles,我想获取某个用户是 Circle 成员的所有 Tenders,所以我有这样的东西:

    public IEnumerable<Tender> GetTenders(string userId)
    {
        var user = _context.Users.Where(u => u.Id == userId);

        return _context.Tenders
                       .Include("TenderCircles.Circle.Members")
                       .Where(t => t.Visibility == TenderVisibility.Public ||
                             (t.Visibility == TenderVisibility.Circles && t.TenderCircles.Select(tc => tc.Circle.Members).ToList().Contains(user.ToList()))).ToList()
                       .ToList();
    }

但在我看来,这太复杂了,而且它实际上不起作用,因为它抛出错误,说第二部分不允许我 select 圈子成员并检查是否包含用户。知道如何更有效地实现我想要的吗?

您不能在 Where 条件下调用 ToList。您可以使用 Any 代替;

 public IEnumerable<Tender> GetTenders(string userId)
    {
        var user = _context.Users.Where(u => u.Id == userId);

        return _context.Tenders
                       .Include("TenderCircles.Circle.Members")
                       .Where(t => t.Visibility == TenderVisibility.Public ||
                             (t.Visibility == TenderVisibility.Circles && t.TenderCircles.Any(tc => tc.Circle.Members.Any(m=>m.Id == userId)))
                       .ToList();
    }

我无法尝试,因为它的复制有点复杂。但是如果有任何语法错误请告诉我