如何在 linq 中使用三元运算符筛选数据

本文关键字:三元 运算符 数据 筛选 linq | 更新日期: 2023-09-27 18:30:52

var PFOpeningList = (from emp in dbContext.EmployeeList
                                 join dsg in dbContext.hrmDesig on emp.HrmDesignationId equals dsg.Id into DsgLeftJoin
                                 from dsgleftjoin in DsgLeftJoin.DefaultIfEmpty()
                                 join opb in dbContext.PfOpeningBalances on emp.Id equals opb.HrmEmployeeId into OpbLeftJoin
                                 from opbleftjoin in OpbLeftJoin.DefaultIfEmpty()
                                 where opbleftjoin.CmnCalendarYearId == clndrId
                                       && (empId != 0 ? emp.Id == empId
                                       : (dptId != 0 ? emp.HrmDepartmentId == dptId
                                         : (officId != 0 ? emp.HrmOfficeId == officId : emp.CmnCompanyId == CmnId)))
                                       && emp.CmnCompanyId == CmnId
                                 select new
                                 {
                                     EmployeeId=emp.Id,
                                     EmployeeName=emp.Name,
                                     Designation = dsgleftjoin.Name,
                                     OpeningIncome = (decimal?)opbleftjoin.OpeningIncome,
                                     EmployeeContribution = (decimal?)opbleftjoin.EmployeeContribution,
                                     CompanyContribution = (decimal?)opbleftjoin.CompanyContribution
                                 }).ToList();

我想从员工名单中获得所有员工称号(hrmDesig)。使用日历年进行筛选是强制性的。但是,如果用户选择"办公室/部门/员工",则还应过滤数据。我怎样才能做到这一点?

如何在 linq 中使用三元运算符筛选数据

这里根本不需要使用条件运算符...我怀疑你想要一个where条款:

where opbleftjoin.CmnCalendarYearId == clndrId
   && (empId == 0 || emp.Id == empId)
   && (dptId == 0 || emp.HrmDepartmentId == dptId)
   && (officId != 0 ? emp.HrmOfficeId == officId)
   && emp.CmnCompanyId == CmnId;

更好的是,您可以分步添加条件 - 只需从强制性条件开始:

var query = from emp in dbContext.EmployeeList
            join dsg in dbContext.hrmDesig on emp.HrmDesignationId equals dsg.Id into DsgLeftJoin
            from dsgleftjoin in DsgLeftJoin.DefaultIfEmpty()
            join opb in dbContext.PfOpeningBalances on emp.Id equals opb.HrmEmployeeId into OpbLeftJoin
            from opbleftjoin in OpbLeftJoin.DefaultIfEmpty()
            where opbleftjoin.CmnCalendarYearId == clndrId
               && emp.CmnCompanyId == CmnId
            select new { emp, dsgleftjoin, opbleftjoin };
if (empId != 0)
{
    query = query.Where(x => x.emp.Id == empId);
}
// etc

另请注意,您的查询当前似乎假定 dsgleftjoinopbleftjoin 为非 null,而由于左联接,它们很容易为 null。

你的 where 条件是错误的,你应该尝试这样的事情:

var PFOpeningList = (from emp in dbContext.EmployeeList
    join dsg in dbContext.hrmDesig on emp.HrmDesignationId equals dsg.Id into DsgLeftJoin
    from dsgleftjoin in DsgLeftJoin.DefaultIfEmpty()
    join opb in dbContext.PfOpeningBalances on emp.Id equals opb.HrmEmployeeId into OpbLeftJoin
    from opbleftjoin in OpbLeftJoin.DefaultIfEmpty()
    where opbleftjoin.CmnCalendarYearId == clndrId
        && (empId != 0 ? emp.Id == empId : true)
        && (dptId != 0 ? emp.HrmDepartmentId == dptId : true)
        && (officId != 0 ? emp.HrmOfficeId == officId : true)
        && emp.CmnCompanyId == CmnId
    select new
    {
        EmployeeId=emp.Id,
        EmployeeName=emp.Name,
        Designation = dsgleftjoin.Name,
        OpeningIncome = (decimal?)opbleftjoin.OpeningIncome,
        EmployeeContribution = (decimal?)opbleftjoin.EmployeeContribution,
        CompanyContribution = (decimal?)opbleftjoin.CompanyContribution
    }).ToList();

这个想法是,如果您的过滤器参数为 0,则可以避免将条件设置为 true