当我从Azure功能运行LINQ查询时失败,但不是从控制台应用程序运行

时间:2018-05-04 18:01:38

标签: linq azure azure-functions azure-cosmosdb

我将一些代码从传统的辅助角色移动到Azure功能。我发现了一行代码,当我从控制台应用程序调用它时返回结果,但是当我从函数调用它时返回null。

现在,对于一些示例代码。我编写了一个_resultProvider类,它基本上查询底层的CosmosDB数据库 - 在基类中,它创建一个IOrderedQueryable查询并根据您作为参数传入的谓词对其进行过滤。第一行代码仅在我从控制台应用程序调用它时返回结果,如果我从Azure函数调用它,则返回null。第二行从任一平台返回结果。

从worker角色调用时获取结果,但从函数调用时为null:

var res1 = _resultProvider.GetSpecialAsync(o => id == o.Id).Result.FirstOrDefault();

从worker角色或函数获取结果:

var res2 = _resultProvider.GetSpecialAsync(o => 1 == 1).Result.Where(o=>id==o.Id).FirstOrDefault();

我猜这是某种LINQ问题,因为传递谓词似乎不起作用,但是如果我得到所有结果并查询结果集,它就有效。

这里是GetSpecialAsync代码:

public async Task<IEnumerable<T>> GetItemsSpecialAsync(Expression<Func<T, bool>> predicate)
{
    IDocumentQuery<T> query = client.CreateDocumentQuery<T>(
            UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId),
            new FeedOptions { MaxItemCount = -1, EnableCrossPartitionQuery = true})
        .Where(predicate)
        .AsDocumentQuery();

    List<T> results = new List<T>();
    while (query.HasMoreResults)
    {
        results.AddRange(await query.ExecuteNextAsync<T>());
    }

    return results;
}

这是我试图返回的类型,ResultDocVm:

public class ResultDocVm : DocViewModelBase
{
    public string Name { get; set; }
    public long AccountId { get; set; }
    // ... insert more junk here with getters and setters
}

此处的DocViewModelBase:

public abstract class DocViewModelBase
{
    [JsonProperty(PropertyName = "id")]
    public string Id { get; set; }

    public DateTime? CreatedAt { get; set; }
    //... even more junk here
}

1 个答案:

答案 0 :(得分:1)

因此,在所有来回之后,看起来控制台应用程序将<p style="font-size:18px; color:#FF2C55; line-height:0; text-align: center;">ARTIST</p> 属性考虑在内,而Azure功能则没有。

这会生成一个不会返回结果的查询,因为JsonProperty属性将是大写的而不是小写的,即Id

这听起来像是Azure级别的Azure功能的一个错误,而不是您自己的代码。