Есть ли способ показать одного сотрудника с каждым из его проектов, используя запрос в Entity Framework

#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 ускользало от меня. Спасибо 🙂