Запрос LINQ по отношению EF Core «многие ко многим»

#c# #linq #.net-core #entity-framework-core #ef-core-5.0

Вопрос:

У меня есть следующие отношения «многие ко многим», смоделированные (по соглашению) в ядре 5 Entity Framework:

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

Как мне построить запрос с использованием синтаксиса fluent LINQ (например _dbContext.Owners.Where(s => s.Id == 1); ), который вернет все задачи, у которых нет владельцев, пожалуйста?

Комментарии:

1. Я не вижу здесь никакой сложной проблемы — задачи без владельцев выражаются естественным .Where(task => !task.OwnersLink.Any()) образом .

Ответ №1:

Два ответа, которые были даны до сих пор, упустили или проигнорировали тот факт, что у вас есть это свойство навигации Task.OwnersLink . Все, что вам нужно сделать, это проверить, не содержит ли он каких-либо предметов.

 _dbContext.Tasks.Where(t => !t.OwnersLink.Any())
 

Это кажется небольшой разницей, но когда запросы становятся больше, очень легко ошибиться в этих ненужных ручных «соединениях», подобных o => o.TaskId == t.Id .

Ответ №2:

чтобы вернуть все задачи, у которых нет владельцев, попробуйте это

  var tasks= _dbContext.Tasks
.Where(t => !_dbContext.TaskOwners.Any(to => to.TaskId == t.Id))
.ToList();
 

Ответ №3:

 var tasksWithoutOwner = ctx.Tasks
   .Where(x => ctx.TaskOwners.Any(y => y.TaskId == x.Id) == false);
 

Комментарии:

1. Спасибо тебе @Marc G!