c# - 每个不为空的 Parameter 对象属性,作为条件添加到表达式谓词中
问题描述
我正在寻找一种基于方法参数动态构建表达式的方法。
这是我的服务方法中的代码片段,我想在其中构建谓词表达式。
public async Task<Account> GetCustomerAccountsAsync(Parameters params)
{
var items = await _unitOfWork.Accounts.GetWhereAsync(a => a.CustomerId == params.CustomerId && ... );
...
}
GetWhereAsync是通用存储库中的一个方法,如下所示:
public async Task<IEnumerable<TEntity>> GetWhereAsync(Expression<Func<TEntity, bool>> predicate)
{
return await Context.Set<TEntity>().Where(predicate).ToListAsync();
}
和参数类:
public class Parameters
{
public string CustomerId { get; set; }
public string AccountId { get; set; }
public string ProductId { get; set; }
public string CurrencyId { get; set; }
}
我想实现的是,每个不是null的Parameter对象属性都作为条件添加到表达式谓词中。
例如,如果CustomerId和AccountId有一些值,我想动态构建与以下谓词具有相同功能的谓词表达式:
var items = await _unitOfWork.Accounts.GetWhereAsync(a => a.CustomerId == params.CustomerId && a.AccountId == params.AccountId);
感谢任何帮助。
解决方案
您不需要使用表达式在这里动态构建一些东西。你可以这样做:
_unitOfWork.Accounts.Where(a =>
(params.CustomerId == null || a.CustomerId == params.CustomerId) &&
(params.AccountId == null || a.AccountId == params.AccountId) &&
(params.ProductId == null || a.ProductId == params.ProductId) &&
(params.CurrencyId == null || a.CurrencyId == params.CurrencyId)
);
这就是我之前对具有多个可选搜索参数的搜索表单进行查询的方式。
推荐阅读
- python - zip输出中的值数量不正确?
- elixir - 如何在同一范围内配置实时仪表板和 JSON API?
- mysql - MySQL将触发器从更新转换为插入
- reactjs - 如何使用 d3-scale 时间获取两个日期之间的日期
- sql-server - SSIS2017 项目不从环境中获取参数
- python - MultiIndexing pandas 数据框,带有用于箱线图的加载文件名前缀
- python - RPi.GPIO 中断然后让调用者立即返回?
- powershell - 如何在 powershell 中验证 IIS web.config
- r - 使用 ggtree 时,“错误:必须从色调调色板中请求至少一种颜色”
- python - Python - 将两个 Pandas 数据帧合并为一个,如果索引存在则更新该行,如果不存在则添加一行