要求是将任何自定义表达式查询传递给documentDB并根据它获取记录。
public Task<dynamic> ExecuteQuery(Func<TEntity, dynamic> lambda)
{
dynamic result = client.CreateDocumentQuery<dynamic>(documentCollectionUri).Where(lambda); //compile error
return result;
}
上面的函数可以像这样调用:
var res = await _locationDbRepository.ExecuteQuery(x => x.Name == "raja" && x.Address == "abc");
显然,它会给出编译时错误,因为Where()
期待predicate
,但我需要传递func
。我不想传递predicate
,因为它总是返回一个布尔值,但func
可以返回任何内容。
上述查询documentdb
的方法不起作用,您可以基于lambda表达式建议其他任何方式吗?
答案 0 :(得分:3)
所以,我通过传递Expression<Func<TEntity, bool>>
作为参数来找出解决方案,并根据lambda表达式返回预期结果。
public async Task<IEnumerable<TEntity>> GetByExpression(Expression<Func<TEntity, bool>> expression)
{
IEnumerable<TEntity> IEnumerable;
List<TEntity> List = new List<TEntity>();
try
{
IDocumentQuery<TEntity> Queryable = client.CreateDocumentQuery<TEntity>(documentCollectionUri)
.Where(expression)
.AsDocumentQuery();
while (Queryable.HasMoreResults)
{
foreach (TEntity t in await Queryable.ExecuteNextAsync<TEntity>())
{
List.Add(t);
}
}
}
catch (DocumentClientException ex)
{
throw ex;
}
IEnumerable = List;
return IEnumerable;
}
可以像这样调用:
dynamic results = SomeObj.GetByExpression(c=>c.Name== "raja" || c.Rank==12);