每个不为空的 Parameter 对象属性,作为条件添加到表达式谓词中

Vla*_*mir 6 c# linq lambda entity-framework func

我正在寻找一种基于方法参数动态构建表达式的方法。

这是我的服务方法的代码片段,我想在其中构建谓词表达式。

    public async Task<Account> GetCustomerAccountsAsync(Parameters params)
    {
        var items = await _unitOfWork.Accounts.GetWhereAsync(a => a.CustomerId == params.CustomerId && ... );
        ...
    }
Run Code Online (Sandbox Code Playgroud)

GetWhereAsync是通用存储库中的一种方法,如下所示:

    public async Task<IEnumerable<TEntity>> GetWhereAsync(Expression<Func<TEntity, bool>> predicate)
    {
        return await Context.Set<TEntity>().Where(predicate).ToListAsync();
    }
Run Code Online (Sandbox Code Playgroud)

参数类:

    public class Parameters
    {
        public string CustomerId { get; set; }
        public string AccountId { get; set; }
        public string ProductId { get; set; }
        public string CurrencyId { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

我想要实现的是,每个非null 的Parameter对象属性都作为条件添加到表达式谓词中。

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

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

Run Code Online (Sandbox Code Playgroud)

感谢任何帮助。

Val*_*tor 5

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

_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)
);
Run Code Online (Sandbox Code Playgroud)

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