如何向方法传递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(); }
注意事项
- 确保泛型类型
T确实包含ClientId(int类型)和Name(string类型)的公共属性,否则编译会报错。 - 建议添加
clientsIds的非空检查,避免调用Contains时触发NullReferenceException:if (clientsIds == null) throw new ArgumentNullException(nameof(clientsIds));
内容的提问来源于stack exchange,提问作者lonelydev101
相关产品推荐
相关产品推荐

