在 LINQ 查询中将 POCO 中的属性名称映射到 Cosmos Db 中的字段名称时出现问题

问题描述 投票:0回答:1

我有一个模型,在 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 属性在其余情况下工作正常

知道可能出了什么问题吗?

azure-cosmosdb
1个回答
0
投票

根据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
,您可以按原样复制上面的代码并使用它。该代码处理所有情况。

© www.soinside.com 2019 - 2024. All rights reserved.