У меня есть несколько ответов для вас, но сначала кажется, что у вас что-то не так с вашей первой частью вашего запроса.Вы делаете .Take(1)
на Employees
, что даст вам только одно значение x
.Поскольку вы не используете x
в оставшейся части запроса, тогда использование Employees
является излишним.
Теперь, поскольку все ваши запросы очень похожи, я попытался удалить повторение.Первое, что нужно сделать, это получить общий фильтр для смен, по которым вы фильтруете.
Если у вас есть одна смена, используйте это:
int shiftID = 1;
var shifts = new [] { shiftID, };
Если у вас несколько смен,используйте это:
var shifts = new [] { 1, 2, 3, };
В любом случае вы получите массив целых чисел, представляющих сдвиги, по которым вы хотите фильтровать.Для всех приведенных ниже ответов требуется этот массив shifts
.
Затем определите запрос для сотрудников в эту смену, независимо от должности на данный момент.
var employeesInShifts =
from p in context.Persons
where p.IsEmployee
where shifts.Contains(p.ShiftID)
select p;
Таким образом, вы можете получитьсчетчик сдвигов выглядит следующим образом:
var shiftCount =
new
{
ManagerCount = employeesInShifts
.Where(p => p.PositionID == 1)
.Count(),
PartTimeCount = employeesInShifts
.Where(p => p.PositionID == 2 || p.PositionID == 3)
.Count(),
// etc
};
Возможно, лучшая альтернатива для вас - преобразовать запрос employeesInShifts
в словарь, а затем просто извлечь значения из словаря.
var employeesInShifts =
(from p in context.Persons
where p.IsEmployee
where shifts.Contains(p.ShiftID)
group p by p.PositionID into gps
select new
{
PositionID = gps.Key,
Count = gps.Count(),
})
.ToDictionary(pc => pc.PositionID, pc.Count);
var shiftCount =
new
{
ManagerCount = employeesInShifts[1],
PartTimeCount = employeesInShifts[2] + employeesInShifts[3],
// etc
};
Недостатком этого подхода является то, что вы действительно должны проверить, что в словаре есть значения для каждого PositionID
, прежде чем получать значения.
Это можно исправить, введя массив идентификаторов позиций, который вы хотитесловарь, чтобы иметь и объединить ваши результаты по этому.
var positionIDs = new [] { 1, 2, 3, };
var employeesInShifts =
(from p in context.Persons
where p.IsEmployee
where shifts.Contains(p.ShiftID)
where positionIDs.Contains(p.PositionID)
select p).ToArray();
var allPositionEmployeesInShifts =
from pid in positionIDs
join p in employeesInShifts on pid equals p.PersonId into gps
select new
{
PositionID = pid,
Count = gps.Count(),
};
var countOfPositionID =
allPositionEmployeesInShifts
.ToDictionary(x => x.PositionID, x => x.Count);
var shiftCount =
new
{
ManagerCount = countOfPositionID[1],
PartTimeCount = countOfPositionID[2] + countOfPositionID[3],
// etc
};
Теперь это гарантирует, что ваш окончательный словарь будет содержать количество всех идентификаторов позиций, которые вы хотите запросить.
ПустьЯ знаю, работает ли это или вам действительно нужно присоединиться к столу Employees
и т. д.