#c# #sql-server #entity-framework #linq
#c# #sql-сервер #entity-framework #linq
Вопрос:
У меня есть две таблицы Employees
и Projects
.
У каждого сотрудника может быть несколько проектов. Над каждым проектом может работать несколько сотрудников. Итак, связь — это многие ко многим.
Ограничения внешнего ключа используются в третьей таблице, EmployeesProjects
которая в Entity Framework заменена виртуальными свойствами ICollection<Employee>
в entity Project
и ICollection<Project>
в entity Employee
.
Я ищу способ вернуть выборку, в которой данные сотрудника объединяются с данными каждого из его проектов отдельно. Итак, если у сотрудника 3 проекта, результатом будет 3 строки — в каждой строке должны быть данные от сотрудника и его проекта.
Я знаю, как это сделать в обычном SQL, но я хочу сделать это базовым способом с помощью Linq. Кроме того, я не хочу использовать собственный запрос из Visual Studio.
До сих пор я пытался:
Select(emp => new { emp, emp.Projects })
но это следует использовать с foreach
for emp.Projects
, чтобы дать мне то, что мне нужно, в то время как мне нужно предварительно получить результат.
Я играл с join, но emp
у него нет ProjectID и он emp.Projects
не может предоставить employeeId
свойство (это очевидно, но в моем отчаянии я попробовал с pr.Employees.FirstOrDefault()
и другими способами предоставления EmployeeID
).
Я новичок в Entity Framework, и мне интересно, возможно ли что-то, что на первый взгляд кажется таким простым, сделать с помощью средства LINQ.
Ответ №1:
Это касается .SelectMany()
:
var tuples = employees.SelectMany(employee => employee.Projects.Select(project =>
new {employee, project}
));
или неявно во встроенном linq:
var tuples =
from employee in employees
from project in employee.Projects
select new {employee, project};
Комментарии:
1. Выберите Many(employee => сотрудник. Проекты. Select(project => new {employee, project} сделал свое дело, хотя именно вложенное использование select ускользало от меня. Спасибо 🙂