Страницы

Поиск по вопросам

четверг, 26 декабря 2019 г.

Перевод SQL запроса в LINQ

#c_sharp #sql #net #entity_framework #linq


Здраствуйте. Есть такой 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();
        PositionEmployees = new HashSet();
    }

    public long Id { get; set; }
    public long? IdSubordinate { get; set; }
    public string DeptName { get; set; }

    public Subdivisions IdSubordinateNavigation { get; set; }
    public ICollection InverseIdSubordinateNavigation { get; set; }
    public ICollection 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; }
}



    


Ответы

Ответ 1



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

Ответ 2



навскидку, так: 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 };

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

Отправить комментарий