.net Azure Cosmos SDK:用于嵌套集合中查询的谓词构建器

问题描述 投票:0回答:1

我有一个数据结构

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# 中进行过滤,这不是很好(与数据库级别的过滤相比)。

c# azure-cosmosdb
1个回答
0
投票

我认为没有任何办法可以不直接在过滤器谓词中使用 lambda。作为替代方案,您可以将所有逻辑链接在一起。也许不是最优雅的解决方案,但由于缺乏更好的答案,它至少可以让您实现逻辑。

return queryable.Where(carMake => carMake.Cars.Any(c => 
    (maxPrice <= 0 || c.Price <= maxPrice) &&
    (minPrice <= 0 || c.Price >= minPrice)
    )
);
© www.soinside.com 2019 - 2024. All rights reserved.