我有一个模型,在 Cosmos Db 数据库中定义字段
date_sk
,并在代码中对应 DateSk
:
public class TestEntity { ...
[JsonPropertyName("date_sk")]
public Date DateSk { get; set; }
}
在 Cosmos Db 资源管理器中运行像
SELECT * FROM c where c.date_sk='2011-11-11'
这样的查询,或者在 C# 中作为原始查询,如下所示,没有任何问题:
FeedIterator<TestEntity> feeder = GetContainer().GetItemQueryIterator<TestEntity>(
new QueryDefinition($"SELECT * FROM c where c.date_sk='2011-11-11'"));
但是当我尝试运行 LINQ 替代方案时:
var feeder = GetContainer()
.GetItemLinqQueryable<TestEntity>()
.Where(f => f.DateSk == "2021-11-11");
它没有抛出任何错误,但没有返回任何内容,当我设置断点来查看在后台运行的 SQL 查询时,我可以看到
SELECT VALUE root FROM root WHERE (root["DateSk"] = "2021-11-11")
。它直接显示使用 f;at 的 DateSk
属性名称,而不是使用 JsonPropertyName 属性设置的 date_sk
真实字段名称。有趣的是,如果我使用 LINQ 查询以外的其他查询,映射工作正常,至少数据可以在 date_sk->DateSk 方向上正确传输,因此 JsonPropertyName 属性在其余情况下工作正常
知道可能出了什么问题吗?
根据CosmosDB SDK源代码,如果您继承自
CosmosLinqSerializer
,则可以实现SerializeMemberName
https://github.com/Azure/azure-cosmos-dotnet-v3/blob/b9b35bb92d5b0c075259a4d78287bff0f66c9861/Microsoft.Azure.Cosmos.Samples/Usage/SystemTextJson/CosmosSystemTextJsonSerializer.cs#L55
对于
System.Text.Json
,您可以按原样复制上面的代码并使用它。该代码处理所有情况。