如何检索参与多对多关系的对象



User(Contributor(和TaskType之间存在多对多关系。我只想将贡献者中有当前用户的TaskTypes分配给变量。显然,我可以使用实体框架的功能以某种方式做到这一点。但是怎么做呢?我使用asp.net核心3。

下面我尝试做它没有成功:

public IQueryable<TaskType> ContributedTaskTypes
{
get
{
// This code doesn't work!
return _dbContext.TaskTypes.Where(t => t.Contributors.Contains(c => c.UserId == CurrentUserId));
}
}

以下是该关系中涉及的所有模型的定义:

public class TaskType
{
public int Id { get; set; }
public string UserId { get; set; }
public ApplicationUser ApplicationUser { get; set; }
public virtual List<Contribution> Contributors { get; set; }
}
public class Contribution
{
public int Id { get; set; }
public string UserId { get; set; }
public ApplicationUser ApplicationUser { get; set; }
public int TaskTypeId { get; set; }
public TaskType TaskType { get; set; }
}
public class ApplicationUser : IdentityUser
{
public virtual List<Contribution> ContributedToTaskTypes { get; set; }
}

对于那些查询,在可以点到结果的地方进行查询总是最容易的。

以下是具有类似sql语法的查询

from row in _dbContext.Contribution
where row.UserId == CurrentUserId
select row.TaskType

通过选择行。TaskType而不仅仅是行,您可以得到正确的实体。

  1. 是否从DB中正确检索到Contributors属性?如果不是,则必须调用Include()方法来加载/引用关系引用实体

    _dbContext.TaskTypes.Include(p=>p.Contributors).Where(..

更多:https://learn.microsoft.com/en-us/ef/core/querying/related-data

  1. 此外,如果EF核心表关系未正确定义,则应遵循此说明:https://www.entityframeworktutorial.net/efcore/configure-many-to-many-relationship-in-ef-core.aspx

最新更新