Здраствуйте. Есть такой SQL запрос
SELECT e."Id", e."FirstName", e."SecondName", e."Patronymic",
s."DeptName" AS MainSubdivision,
CASE WHEN s."Id" = ss."Id" THEN NULL ELSE ss."DeptName" END AS SubordinateSubdivision
FROM "Subdivisions" AS s
JOIN "Subdivisions" AS ss
ON s."Id" IN (ss."IdSubordinate", ss."Id")
JOIN "PositionEmployees" AS pe
ON pe."IdSubdivision" = ss."Id"
JOIN "Employee" AS e
ON e."Id" = pe."IdEmployee"
WHERE s."IdSubordinate" IS NULL
Я пытаюсь перевести его в LINQ но не совсем понимаю как реализовать вот такую операцию ON s."Id" IN (ss."IdSubordinate", ss."Id")
Буду очень признателен за помощь
вот схема БД и модели из EntityFramework
public class Subdivisions
{
public Subdivisions()
{
InverseIdSubordinateNavigation = new HashSet<Subdivisions>();
PositionEmployees = new HashSet<PositionEmployees>();
}
public long Id { get; set; }
public long? IdSubordinate { get; set; }
public string DeptName { get; set; }
public Subdivisions IdSubordinateNavigation { get; set; }
public ICollection<Subdivisions> InverseIdSubordinateNavigation { get; set; }
public ICollection<PositionEmployees> PositionEmployees { get; set; }
}
public class PositionEmployees
{
public long Id { get; set; }
public long IdEmployee { get; set; }
public long IdSubdivision { get; set; }
public Employee IdEmployeeNavigation { get; set; }
public Position IdPositionNavigation { get; set; }
public Subdivisions IdSubdivisionNavigation { get; set; }
}
public class Employee
{
public long Id { get; set; }
public string FirstName { get; set; }
public string SecondName { get; set; }
public string Patronymic { get; set; }
public PositionEmployees PositionEmployees { get; set; }
}
var q = from s in Subdivisionsess
from ss in Subdivisionsess
where s.Id == ss.Id || s.Id == ss.IdSubordinate
join pe in PositionEmployeesess
on ss.Id equals pe.IdSubdivision
join e in Employees
on pe.IdEmployee equals e.Id
where s.IdSubordinate == null
select new
{
e.Id,
e.FirstName,
e.SecondName,
e.Patronymic,
MainSubdivision = s.DeptName,
SubordinateSubdivision = s.Id == ss.Id ? null : ss.DeptName
};
Но на самом деле вы не должны так никогда писать (вся эта куча JOIN), вы должны пользоваться навигационными свойствами.
Если вы опишите словами более подробно что делает ваш запрос, то вам напишут как правильно это сделать с помощью Linq
навскидку, так:
var result = from s in subdivisions
join ss in subdivisions on s.Id equals ss.Id
join sss in subdivisions on s.Id equals sss.IdSubordinate //! "X equals Y" ни в коем случае не менять местами ХЪ
join pe in positionEmployees on ss.Id equals pe.IdSubdivision
join e in employee on pe.IdEmployee equals e.Id
where s.IdSubordinate != null
select new { e.Id, e.FirstName, e.SecondName, e.Patronymic,
MainSubdivision = s.DeptName,
SubordinateSubdivision = (s.Id == ss.Id) ? null : ss.DeptName
};
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости