Linq的三元运营商

时间:2015-05-31 15:36:32

标签: 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,
                         };

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

我试过了:

previousMonthPayroll.Where(t => t.EmployeeId == payroll.EmployeeId)
                    .FirstOrDefault().Salary ?? default(decimal);

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

5 个答案:

答案 0 :(得分:4)

您可以使用Enumerable.DefaultIfEmpty

previousMonthPayroll.Where(t => t.EmployeeId == payroll.EmployeeId)
                    .DefaultIfEmpty(yourDefaultObject)
                    .First();

yourDefaultObject是一个默认工资为default(decimal)的对象。

答案 1 :(得分:4)

您可以使用let关键字:

from payroll in currentMonthPayroll
let prevSalary = previousMonthPayroll.FirstOrDefault(t => t.EmployeeId == payroll.EmployeeId)
select new SalaryDifference
{
    PreviousMonthSalary = prevSalary != null ? prevSalary.Salary : default(decimal)
};

请参阅MSDN

答案 2 :(得分:3)

如果您使用的是C#6.0,则可以将安全导航操作符与空合并操作符混合使用:

PreviousMonthSalary = previousMonthPayroll
                     .Where(t => t.EmployeeId == payroll.EmployeeId).FirstOrDefault()?.Salary 
                     ?? default(decimal)

答案 3 :(得分:2)

正如所有答案所见,有几种方法可以做到这一点,我的首选方式是:

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

答案 4 :(得分:0)

你实际上正在做的是加入可枚举的序列,所以为什么不这样说,让LINQ处理细节:

  var result = from currentPayroll in currentMonthPayroll
               join previousPayroll in previousMonthPayroll on currentPayroll.EmployeeId equals previousPayroll.EmployeeId
               into joined
               from r in joined.DefaultIfEmpty()
               select new SalaryDifference
               {
                 PreviousMonthSalary = r == null ? default(decimal) : r.Salary,
               };

这样做的好处还在于比其他方法更有效率。