当我从 Azure 函数而不是从控制台应用程序运行 LINQ 查询时,它会失败
Posted
技术标签:
【中文标题】当我从 Azure 函数而不是从控制台应用程序运行 LINQ 查询时,它会失败【英文标题】:LINQ query fails when I run it from an Azure Function, but not from a console app 【发布时间】:2018-10-15 06:48:15 【问题描述】:我正在将一些代码从传统的辅助角色转移到 Azure 函数。我找到了一行代码,当我从控制台应用程序调用它时返回结果,但当我从函数调用它时返回 null。
现在,一些示例代码。我编写了一个 _resultProvider 类,它基本上查询底层 CosmosDB 数据库——在基类中,它创建一个 IOrderedQueryable 查询并根据您作为参数传入的谓词对其进行过滤。第一行代码仅在我从控制台应用程序调用时返回结果,如果我从 Azure 函数调用它,则返回 null。第二行返回任一平台的结果。
从worker角色调用时获取结果,但从函数调用时为null:
var res1 = _resultProvider.GetSpecialAsync(o => id == o.Id).Result.FirstOrDefault();
从辅助角色或函数中获取结果:
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
【问题讨论】:
了解 GetSpecialAsync 中的内容真的很有帮助 @NickChapsas 我已经相应地更新了问题。 好的,让我们一步一步来。只是为了确保它不是某种索引问题,您可以将 FeedOptions 中的EnableScanInQuery
设置为 true 看看会发生什么?
我知道这听起来很奇怪,但我在 FirstOrDefault 的结果以及 LINQ 中的相等运算符中存在不一致。也尝试使用 .Equals 代替 ==
另外,我不太了解 azure 函数的同步上下文,但您应该始终使用 .GetAwaiter().GetResult()
而不是 .Wait()
和 .Result
【参考方案1】:
因此,经过所有来回之后,看起来控制台应用程序正在考虑JsonProperty
属性,而 Azure 函数却没有。
这会生成一个不会返回任何结果的查询,因为Id
属性将是大写而不是小写,即id
。
这听起来像是 Azure 级别的 Azure 函数的错误,而不是您的代码本身。
【讨论】:
谢谢。对于其他阅读本文但没有通过原始问题的 cmets 的人,您可以通过使用 StartsWith 而不是测试相等性来规避这个问题。 尼克 -- 临时解决方法似乎不再有效。我一直在尝试查看是否可以像您在之前的评论中提到的那样手动替换表达式主体,但我很难过。你能为我指出正确的方向吗?如何替换表达式主体?以上是关于当我从 Azure 函数而不是从控制台应用程序运行 LINQ 查询时,它会失败的主要内容,如果未能解决你的问题,请参考以下文章
Azure Functions 2 - 如何控制 json 序列化设置
如何通过 Visual Studio 修复功能应用发布中的错误