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();
我需要根据 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();