LINQ 查询 EF Core 多对多关系
LINQ Query on EF Core many-to-many relationship
我在 Entity Framework Core 5 中建立了以下多对多关系模型(按照惯例):
public class Task
{
public int Id { get; set; }
public DateTime EndDateTime { get; set; }
public string Notes { get; set; }
// Relationships
public ICollection<TaskOwner> OwnersLink { get; set; }
}
public class TaskOwner
{
public int TaskId { get; set; }
public int OwnerId { get; set; }
public Status Status { get; set; }
// Relationships
public Task Task { get; set; }
public Owner Owner { get; set; }
}
public class Owner
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
// Relationships
public ICollection<TaskOwner> TasksLink { get; set; }
}
如何使用流畅的 LINQ 语法(例如 _dbContext.Owners.Where(s => s.Id == 1);
)构造一个查询,以便 return 所有没有任何所有者的任务?
var tasksWithoutOwner = ctx.Tasks
.Where(x => ctx.TaskOwners.Any(y => y.TaskId == x.Id) == false);
到 return 所有没有任何所有者的任务都试试这个
var tasks= _dbContext.Tasks
.Where(t => !_dbContext.TaskOwners.Any(to => to.TaskId == t.Id))
.ToList();
到目前为止给出的两个答案错过或忽略了您拥有此导航的事实 属性 Task.OwnersLink
。您所要做的就是检查它是否不包含任何项目。
_dbContext.Tasks.Where(t => !t.OwnersLink.Any())
看起来差别很小,但是当查询变大时,很容易在这些不必要的手动“连接”中出错,例如 o => o.TaskId == t.Id
。
我在 Entity Framework Core 5 中建立了以下多对多关系模型(按照惯例):
public class Task
{
public int Id { get; set; }
public DateTime EndDateTime { get; set; }
public string Notes { get; set; }
// Relationships
public ICollection<TaskOwner> OwnersLink { get; set; }
}
public class TaskOwner
{
public int TaskId { get; set; }
public int OwnerId { get; set; }
public Status Status { get; set; }
// Relationships
public Task Task { get; set; }
public Owner Owner { get; set; }
}
public class Owner
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
// Relationships
public ICollection<TaskOwner> TasksLink { get; set; }
}
如何使用流畅的 LINQ 语法(例如 _dbContext.Owners.Where(s => s.Id == 1);
)构造一个查询,以便 return 所有没有任何所有者的任务?
var tasksWithoutOwner = ctx.Tasks
.Where(x => ctx.TaskOwners.Any(y => y.TaskId == x.Id) == false);
到 return 所有没有任何所有者的任务都试试这个
var tasks= _dbContext.Tasks
.Where(t => !_dbContext.TaskOwners.Any(to => to.TaskId == t.Id))
.ToList();
到目前为止给出的两个答案错过或忽略了您拥有此导航的事实 属性 Task.OwnersLink
。您所要做的就是检查它是否不包含任何项目。
_dbContext.Tasks.Where(t => !t.OwnersLink.Any())
看起来差别很小,但是当查询变大时,很容易在这些不必要的手动“连接”中出错,例如 o => o.TaskId == t.Id
。