Linq - сумма значений внутри оператора select с объединениями - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть предложение выбора с объединением 3 таблиц, которое возвращает что-то вроде зарплаты отдельных сотрудников, мне нужна сумма зарплаты всех сотрудников.

мое утверждение выглядит следующим образом.

Этозаявление возвращает массив зарплат отдельных сотрудников, как я могу получить сумму?

var x = (from e in EmpDB.Employees
      join d in EmpDB.Departments on e.DepId equals d.Id
      join s in EmpDB.EmpSalaries on new { d.Zone, d.Vendor, d.Status } equals new { s.Zone, s.Vendor, s.Status}
      where e.Status = "Active" && e.BAID != NULL && e.DepId == 3
      select new { s.Salary.Value });

Пробовал с использованием суммы, но не уверен в этом

Ответы [ 2 ]

2 голосов
/ 06 ноября 2019

Проблема заключается в том, что вы выбираете новый анонимный тип, а не только зарплаты. Все, что вам нужно сделать, это изменить последнюю строку с select new { s.Salary.Value }); на select s.Salary.GetValueOrDefault());. Это даст вам список типов данных s.Salary (может быть, double??)

Итак, ваш запрос сейчасэто:

var x = (from e in EmpDB.Employees
      join d in EmpDB.Departments on e.DepId equals d.Id
      join s in EmpDB.EmpSalaries on new { d.Zone, d.Vendor, d.Status } equals new { s.Zone, s.Vendor, s.Status}
      where e.Status = "Active" && e.BAID != NULL && e.DepId == 3
      select s.Salary.GetValueOrDefault());

Для всех, кто хочет использовать Expression LINQ, вот оно, для всех, кому все равно, вы можете прекратить чтение.

var allSalaries = EmpDB.Employees.Join(EmpDB.Departments, employee => employee.DepId, department => department.Id,
        (employee, department) => new {Employee = employee, Department = department})
    .Join(EmpDB.EmpSalaries, emplDept => new
            {emplDept.Department.Status, emplDept.Department.Vendor, emplDept.Department.Zone}
        , emplSalary => new {emplSalary.Status, emplSalary.Vendor, emplSalary.Zone},
        (emplDept, emplSalary) => emplSalary.Salary).Sum();

Оба запросане очень читабельны, так как это довольно сложные запросы

2 голосов
/ 06 ноября 2019

Обновлено , чтобы отразить предложение Mindswipe для большей ясности.

Оператор select new { s.Salary.Value } создает перечисляемую коллекцию объектов, содержащих значение заработной платы. Чтобы упростить это, мы можем вместо этого использовать следующее для создания перечисляемой коллекции числовых значений:

select s.Salary

Поскольку вы используете .Value, я предполагаю, что Salary - это тип, допускающий значение NULL, означающий, что мы можем получитьнулевое значение в наборе зарплат, поэтому, чтобы избежать этого, мы будем использовать оператор объединения нулей ??, чтобы вернуть 0 для нулевых значений:

select s.Salary ?? 0

Как только у вас будет коллекция отдельных значений зарплатыВы можете использовать функцию суммы LINQ:

var x = (from e in EmpDB.Employees
      join d in EmpDB.Departments on e.DepId equals d.Id
      join s in EmpDB.EmpSalaries on new { d.Zone, d.Vendor, d.Status } equals new { s.Zone, s.Vendor, s.Status}
      where e.Status = "Active" && e.BAID != NULL && e.DepId == 3
      select s.Salary ?? 0)
      .Sum();

Существуют более понятные и выразительные способы написания того же запроса, но это должно дать вам результат, который вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...