LINQ - IQueryable 多个 where 条件

LINQ - IQueryable multiple where condition

我需要根据 if-else 条件在 where 中添加 1 个额外条件,但代码变得多余。请帮助创建一个通用查询。

if (isFailure)
{
    var result = (from account in context.Account
                  join filetrans in context.FILE_TRANSACTION on account.ACCOUNTID equals filetrans.ACNT_ID
                  where accountIds.Contains(account.ACCOUNTID) && filetrans.PROCESS_STRT_TIME >= fromDateFilter && filetrans.PROCESS_STRT_TIME <= toDateFilter **&& failureStatus.Contains((decimal)filetrans.CRNT_FILE_STATUS_ID)**
                  select new
                              {
                                  account.ACCOUNTINFO,
                                  filetrans.ACNT_ID,
                                  filetrans.FILE_TRANID,
                                  filetrans.FILE_NM,
                                  filetrans.PROCESS_STRT_TIME,
                                  filetrans.CRNT_FILE_STATUS_ID
                              } )
                    .OrderByDescending(o => o.PROCESS_STRT_TIME)
                    .Skip(skip).Take(pageSize).ToList();                   
}
else
{
    var result = (from account in context.Account
                  join filetrans in context.AFRS_FILE_TRANSACTION on account.ACCOUNTID equals filetrans.ACNT_ID
                  where accountIds.Contains(account.ACCOUNTID) && filetrans.PROCESS_STRT_TIME >= fromDateFilter && filetrans.PROCESS_STRT_TIME <= toDateFilter
                  select new
                              {
                                  account.ACCOUNTINFO,
                                  filetrans.ACNT_ID,
                                  filetrans.FILE_TRANID,
                                  filetrans.FILE_NM,
                                  filetrans.PROCESS_STRT_TIME,
                                  filetrans.CRNT_FILE_STATUS_ID
                              })
                      .OrderByDescending(o => o.PROCESS_STRT_TIME)
                      .Skip(skip).Take(pageSize).ToList();                   
}

LINQ 的主要优点是可以组合查询。提取公共部分并稍后应用所需的过滤器。

var query =
    from account in context.Account
    join filetrans in context.FILE_TRANSACTION on account.ACCOUNTID equals filetrans.ACNT_ID
    where accountIds.Contains(account.ACCOUNTID) && 
        filetrans.PROCESS_STRT_TIME >= fromDateFilter && 
        filetrans.PROCESS_STRT_TIME <= toDateFilter
    select new { account, filetrans };

if (isFailure)
{
    query = query.Where(x => failureStatus.Contains((decimal)x.filetrans.CRNT_FILE_STATUS_ID))
}

var result = query
    .Select(x => new 
    {
        x.account.ACCOUNTINFO,
        x.filetrans.ACNT_ID,
        x.filetrans.FILE_TRANID,
        x.filetrans.FILE_NM,
        x.filetrans.PROCESS_STRT_TIME,
        x.filetrans.CRNT_FILE_STATUS_ID
    })
    .OrderByDescending(o => o.PROCESS_STRT_TIME)
    .Skip(skip).Take(pageSize)
    .ToList();