我有一个数据结构
public record CarMake
{
public List<Car> Cars { get; set; }
public string Id {get;set; }
}
现在我想使用谓词生成器仅从 Azure Cosmos DB 返回那些符合所有给定条件的项目:
public static IQueryable<CarMake> CarMakeSearch(this IQueryable<CarMake> queryable,
BaseSearchRequest searchRequest)
{
Func<Car,bool> predicate = c => true;
if (searchRequest.MaxPrice > 0) {
predicate = c => predicate (c) && c.Price <= searchRequest.MaxPrice;
}
//... a lot more of such conditions
return queryable.Where(carMake => carMake.Cars.Any(predicate));
}
无论我尝试什么(带invoke()和不带invoke()的各种ExpressionBuilders),我不断收到来自
Microsoft.Azure.Cosmos.Client
的错误,即不支持invoke(),它必须是一个表达式。
在嵌套列表/集合上进行此类查询的建议方法是什么? 由于返回数据方式的性质,集合必须嵌套。我目前唯一的解决方法是首先使用多个 Any() 条件进行搜索,然后同时在 C# 中进行过滤,这不是很好(与数据库级别的过滤相比)。
我认为没有任何办法可以不直接在过滤器谓词中使用 lambda。作为替代方案,您可以将所有逻辑链接在一起。也许不是最优雅的解决方案,但由于缺乏更好的答案,它至少可以让您实现逻辑。
return queryable.Where(carMake => carMake.Cars.Any(c =>
(maxPrice <= 0 || c.Price <= maxPrice) &&
(minPrice <= 0 || c.Price >= minPrice)
)
);