首页 > 解决方案 > 每个不为空的 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对象属性都作为条件添加到表达式谓词中。

例如,如果CustomerIdAccountId有一些值,我想动态构建与以下谓词具有相同功能的谓词表达式:

    var items = await _unitOfWork.Accounts.GetWhereAsync(a => a.CustomerId == params.CustomerId && a.AccountId == params.AccountId);

感谢任何帮助。

标签: c#entity-frameworklinqlambdafunc

解决方案


您不需要使用表达式在这里动态构建一些东西。你可以这样做:

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

这就是我之前对具有多个可选搜索参数的搜索表单进行查询的方式。


推荐阅读