查询DocumentDB基于lambda表达式func <tentity,dynamic =“”>

时间:2017-03-24 07:33:46

标签: c# sql linq lambda azure-cosmosdb

要求是将任何自定义表达式查询传递给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可以返回任何内容。

  • 可以将SQL查询传递给documentDB,但是我必须使用我不想使用的第三方库将lambda表达式转换为SQL查询。

上述查询documentdb的方法不起作用,您可以基于lambda表达式建议其他任何方式吗?

1 个答案:

答案 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);