如何使用linq中的三元运算符过滤数据

时间:2016-01-19 06:28:20

标签: c# linq

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();

我希望通过EmployeeList实现所有具有指定(hrmDesig)的员工。必须使用日历年过滤。但是,如果用户选择Office / Department / Employee,也应该过滤数据。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

这里根本不需要使用条件运算符...我怀疑你想要一个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非空,因为左连接很容易为空。

答案 1 :(得分:0)

你的情况有问题,你应该尝试这样的事情:

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