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

227
01 сентября 2018, 06:50

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

Answer 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

Answer 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
                        };
READ ALSO
Как организовать очередь к файлу между сессиями

Как организовать очередь к файлу между сессиями

Допустим есть файлВ один момент времени им может пользоваться один инстанс программы

232
Как перехватить ошибку в методе PHP?

Как перехватить ошибку в методе PHP?

В каком-то месте "падает" метод:

233
Построчная запись и удаление из БД

Построчная запись и удаление из БД

Допустим в поле БД надо поместить список id пользователей, для этого, вероятнее всего, надо юзать массив с разделителями

234
parser php ошибка find()

parser php ошибка find()

Fatal error: Uncaught Error: Call to a member function find() on boolean

209