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,则抛出异常。
答案 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,
};
这样做的好处还在于比其他方法更有效率。