Я знаю, что есть тон подобных вопросов, и я прошел через многие из них, но все еще не могу понять, как это сделать в LINQ.Мне нужно создать запрос, извлекающий данные в виде этого чистого SQL-запроса:
SELECT p.ProcessId, p.Description, p.StartedOn, p.StartedBy, uuus.Name + ' ' + uuus.Surname AS StartedByName, p.FinishedOn, p.FinishedBy, uuu.Name + ' ' + uuu.Surname as FinishedByName, p.PlannedFinish, p.PlannedStart, COUNT(CASE WHEN h.IsCompleted IS NULL AND h.HandlingId IS NOT NULL THEN 1 END)
FROM JDE_Processes p LEFT JOIN JDE_Users uuu ON p.FinishedBy = uuu.UserId LEFT JOIN JDE_Handlings h ON h.ProcessId=p.ProcessId LEFT JOIN JDE_Users uuus ON uuus.UserId=p.StartedBy
GROUP BY p.ProcessId, p.Description, p.StartedOn, p.StartedBy,uuus.Name + ' ' + uuus.Surname, p.FinishedOn, p.FinishedBy, uuu.Name + ' ' + uuu.Surname, p.PlannedFinish, p.PlannedStart, p.Createdon
ORDER BY p.CreatedOn DESC
Вот моя версия linq, она в основном работает, но я не могу понять часть 'Count if h.IsCompleted = 0'..
var items = (from p in db.JDE_Processes
join uuu in db.JDE_Users on p.FinishedBy equals uuu.UserId into finished
from fin in finished.DefaultIfEmpty()
join h in db.JDE_Handlings on p.ProcessId equals h.ProcessId into hans
from ha in hans.DefaultIfEmpty()
group new { p, fin }
by new {
p.ProcessId,
p.Description,
p.StartedOn,
p.StartedBy,
p.FinishedOn,
p.FinishedBy,
p.PlannedFinish,
p.PlannedStart,
fin.Name,
fin.Surname
} into grp
orderby grp.Key.ProcessId descending
select new Process
{
ProcessId = grp.Key.ProcessId,
Description = grp.Key.Description,
StartedOn = grp.Key.StartedOn,
StartedBy = grp.Key.StartedBy,
FinishedOn = grp.Key.FinishedOn,
FinishedBy = grp.Key.FinishedBy,
FinishedByName = grp.Key.Name + " " + grp.Key.Surname,
PlannedStart = grp.Key.PlannedStart,
PlannedFinish = grp.Key.PlannedFinish,
HandlingStatus = grp.Count().ToString()
});
Вопросы:
1) как заставить работать 'Count if h.IsCompleted = 0'?
2) Могу ли я использовать псевдонимы какого-либо рода?Я имею в виду, что в реальной версии этого запроса есть еще одно левое объединение join uuu in db.JDE_Users on p.StartedBy equals uuu.UserId into started
from star in started.DefaultIfEmpty()
Это приводит к тому, что у меня есть 2 столбца Имя и 2 Фамилия в grp.Как я могу назначить правильное поле для правильного поля вывода?Я имею в виду, как показано ниже:
select new Process
{
ProcessId = grp.Key.ProcessId,
Description = grp.Key.Description,
StartedOn = grp.Key.StartedOn,
StartedBy = grp.Key.StartedBy,
StartedByName = grp.Key.Name + " " + grp.Key.Surname, // <-- how will it know which Name field to use?
FinishedOn = grp.Key.FinishedOn,
FinishedBy = grp.Key.FinishedBy,
FinishedByName = grp.Key.Name + " " + grp.Key.Surname,
PlannedStart = grp.Key.PlannedStart,
PlannedFinish = grp.Key.PlannedFinish,
HandlingStatus = grp.Count().ToString()
}