我不熟悉 CosmoDB,但是 LINQ 不会更容易吗?
IQueryable<City> query
= cityContainer.GetItemLinqQueryable<City>()
.Where(city => city.Status == "Active")
.GroupBy(city => city);
using FeedIterator<City> iterator = query.ToFeedIterator<City>();
int cityCount = 0;
for (;iterator.HasMoreResults; cityCount++)
{
City city = await setIterator.ReadNextAsync();
// do stuff
}
编辑:
我在评论中的回答示例->
struct City
{
public string Name { get; set; }
public int Population { get; set; }
}
IQueryable<City> cities = default;
Func<City, bool> HasNastyName = c => c.Name.Length > 25;
Func<City, bool> IsMassive = c => c.Population > 500;
var nastyNameCities = cities.Where(HasNastyName);
var massiveCities = cities.Where(IsMassive);
考虑到一般构建这些的附加选项,您可以使用 LINQ 非常动态地构建谓词。我可能会错过您正在尝试做的事情,但我看不到在这里使用表达式树有任何优势。
CosmoDB 的 IQueryProvider<> 已经为您翻译了所有查询,因此除非我不知道某些事情,否则您通过自己将表达式映射到查询来编写不必要且可能不太优化的实现。