I'm creating a Cosmos service, it has basic CRUD but I need to implement a method that receiving an expression with LINQ executes it against the DB. I have this:
public IOrderedQueryable<T> GetLinqQueryable<T>(string partitionKeyFilter = null)
{
var container = GetContainer<Game>();
QueryRequestOptions queryRequestOptions = null;
if (partitionKeyFilter != null)
{
queryRequestOptions = new QueryRequestOptions()
{
PartitionKey = new PartitionKey(partitionKeyFilter),
};
}
return container.GetItemLinqQueryable<T>(requestOptions: queryRequestOptions);
}
public async Task<IList<T>> GetQueryResultsAsync<T>(IQueryable<T> query)
{
var result = new List<T>();
using var iterator = query.ToFeedIterator();
while (iterator.HasMoreResults)
{
var response = await iterator.ReadNextAsync();
result.AddRange(response);
}
return result;
}
But it implies that I have to call twice like this, or in two lines ??:
var results = await _cosmosService.GetQueryResultAsync(_cosmosService.GetLinqQueryable<T>().Where(x => x.Id == 1));
Can this be improved somehow?
question from:
https://stackoverflow.com/questions/65837998/create-a-method-in-a-cosmos-service-that-runs-a-linq-lambda-passed-as-parameter 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…