#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!