我将一些代码从传统的辅助角色移动到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
}
答案 0 :(得分:1)
因此,在所有来回之后,看起来控制台应用程序将<p style="font-size:18px; color:#FF2C55; line-height:0; text-align: center;">ARTIST</p>
属性考虑在内,而Azure功能则没有。
这会生成一个不会返回结果的查询,因为JsonProperty
属性将是大写的而不是小写的,即Id
。
这听起来像是Azure级别的Azure功能的一个错误,而不是您自己的代码。