You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向方法传递Expression<Func<T, bool>>类型的谓词参数

问题:如何正确传递Expression<Func<T, bool>>类型谓词给GetItemsAsync方法?

以下是现有代码:

调用方方法

public async Task<bool> HasAnyPolicyByName(string name, int[] clientsIds, CancellationToken token = default)
{
    System.Linq.Expressions.Expression<Func<T, bool>> predicate = .Where(x => clientsIds.Contains(x.ClientId) && x.Name == name);
    var policyDetails = await _context.AutomaticHourPolicies.GetItemsAsync(predicate);
}

GetItemsAsync方法

public async Task<IEnumerable<T>> GetItemsAsync(Expression<Func<T, bool>> predicate, CancellationToken token = default)
{
    IDocumentQuery<T> query = _dbClient.CreateDocumentQuery<T>(_collectionUri, new FeedOptions { MaxItemCount = -1 }).Where(predicate).AsDocumentQuery();
    List<T> results = new List<T>();
    //... 简化后省略的代码
    return results;
}

修正方案

你当前的错误在于多余的.Where调用——我们需要直接构建Expression<Func<T, bool>>类型的表达式树,而不是对某个集合调用Where方法。C#会自动将符合格式的lambda表达式转换为表达式树,只需直接赋值即可:

修正后的调用方代码:

public async Task<bool> HasAnyPolicyByName(string name, int[] clientsIds, CancellationToken token = default)
{
    // 直接定义表达式树,无需.Where前缀
    System.Linq.Expressions.Expression<Func<T, bool>> predicate = x => clientsIds.Contains(x.ClientId) && x.Name == name;
    var policyDetails = await _context.AutomaticHourPolicies.GetItemsAsync(predicate);
    
    // 补充:方法需要返回bool,可根据查询结果判断
    return policyDetails.Any();
}

注意事项

  1. 确保泛型类型T确实包含ClientId(int类型)和Name(string类型)的公共属性,否则编译会报错。
  2. 建议添加clientsIds的非空检查,避免调用Contains时触发NullReferenceException:
    if (clientsIds == null)
        throw new ArgumentNullException(nameof(clientsIds));
    

内容的提问来源于stack exchange,提问作者lonelydev101

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 23:57:49