Linq 中的三元运算符

Mik*_*ela 5 c# linq

var result = from payroll in currentMonthPayroll
    select new SalaryDifference
    {
        PreviousMonthSalary = previousMonthPayroll.Where(t => t.EmployeeId == payroll.EmployeeId).FirstOrDefault() == null ?
        default(decimal) : previousMonthPayroll.Where(t => t.EmployeeId == payroll.EmployeeId).FirstOrDefault().Salary,
    };
Run Code Online (Sandbox Code Playgroud)

有没有办法不重复previousMonthPayroll.Where(t => t.EmployeeId == payroll.EmployeeId).FirstOrDefault()选择Salary值的逻辑?

我试过:

previousMonthPayroll.Where(t => t.EmployeeId == payroll.EmployeeId)
    .FirstOrDefault().Salary ?? default(decimal);
Run Code Online (Sandbox Code Playgroud)

但是,如果previousMonthPayroll.Where(t => t.EmployeeId == payroll.EmployeeId).FirstOrDefault()为 null,则会抛出异常。

use*_*443 7

您可以使用Enumerable.DefaultIfEmpty

previousMonthPayroll.Where(t => t.EmployeeId == payroll.EmployeeId)
                    .DefaultIfEmpty(yourDefaultObject)
                    .First();
Run Code Online (Sandbox Code Playgroud)

其中yourDefaultObject是默认工资为 的对象default(decimal)


Ale*_*lex 2

正如所有答案所证明的那样,有多种方法可以做到这一点,我首选的方法是:

var result = from payroll in currentMonthPayroll
             select new SalaryDifference
             {
                 PreviousMonthSalary = previousMonthPayroll
                     .Where(t => t.EmployeeId == payroll.EmployeeId)
                     .Select(prev => prev.Salary)
                     .FirstOrDefault()
             };
Run Code Online (Sandbox Code Playgroud)