簡體   English   中英

如何在linq中使用三元運算符過濾數據

[英]How to filter data using ternary operator in 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)的員工。 使用日歷年過濾是強制性的。 但是如果用戶選擇辦公室/部門/員工,數據也應該被過濾。 我怎樣才能做到這一點?

這里根本不需要使用條件運算符......我懷疑你想要一個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是非空的,因為由於左連接,它們很容易為空。

您的 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM