【问题标题】:documentdb query using enums as filter使用枚举作为过滤器的 documentdb 查询
【发布时间】:2017-03-02 21:36:55
【问题描述】:

当面行符合该条件时,我有以下查询(带有完整代码)不返回任何数据。 documentdb 查询不支持枚举吗?

        var query = _client.CreateDocumentQuery<Job>(CollectionUri, new FeedOptions()
        {
            MaxItemCount = 1
        })
        .Where(m => m.State != State.Done)
        .AsDocumentQuery();

        var docs = new List<Job>();
        while (query.HasMoreResults)
        {
            try
            {
                foreach (var p in await query.ExecuteNextAsync<Job>())
                {
                    docs.Add(p);
                }
            }
            catch (DocumentClientException e)
            {
                if (e.StatusCode == HttpStatusCode.NotFound)
                {
                    return docs;
                }
                throw;
            }
        }
        return docs;

我只是将文档作为一个空列表,没有例外。 State 是一个定义如下的枚举 -

[JsonConverter(typeof(StringEnumConverter))]
public enum State
{
    ToProcess,
    Run,
    Done
}



 public class Job {
     [JsonProperty("id")]
     public string Id {get; set;}

     public State State {get;set;}
 }

编辑: 我尝试如下更改 where 子句 -

.Where(m => m.State.ToString() != State.Done.ToString())

但这也不起作用,我收到“不支持方法'ToString'的错误。”

编辑 2:更正了我在上面的编辑中说我有 .ToString() 的错字

编辑 3: 更多信息:

我正在使用默认序列化在文档中使用驼峰式大小写,如下所示

        JsonConvert.DefaultSettings = () => new JsonSerializerSettings()
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver()
        };

这也将所有列转换为驼峰式。

LINQ 生成的实际查询如下 -

{{"query":"SELECT * FROM root WHERE (root[\"State\"] != \"Done\") "}}

因此,“State”与“state”列不匹配。

以下是文档 db 中的示例文档

{
"id": "2017-03-02T22:00:00Z",
"state": "ToProcess"
}

【问题讨论】:

  • 您能否发布您对 Job 的类定义?您使用的是哪个版本的 DocumentDB .NET SDK?
  • 更新了上面的类定义。
  • 我想我现在知道这个问题了 - 这是 LINQ 生成的查询 - {{"query":"SELECT * FROM root WHERE (root[\"State\"] != \"Done \") "}} 清楚 - 查找的列查询是帕斯卡大小写“状态”,而文档中的列是驼峰大小写“状态”。有什么办法吗?

标签: azure-cosmosdb


【解决方案1】:

根据您的最新描述,我假设您可以按如下方式更改模型:

public class Job {
     [JsonProperty("id")]
     public string Id {get; set;}
     [JsonProperty("state")]
     public State State {get;set;}
 }

结果

【讨论】:

  • 谢谢!这解决了它。所以似乎没有办法将 json.net 序列化设置注入到 DocumentClient 中,除了定义我目前所读到的 JsonProperty 属性。
【解决方案2】:

枚举类型是在您的应用中专门定义的。您需要将它们转换为与数据库中的内容匹配的字符串(或数值),因为枚举不是 DocumentDB 中的数据类型。

【讨论】:

  • 这是否意味着JsonConvert在后台没有正确序列化它们?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-22
  • 2013-12-13
  • 2021-02-02
  • 1970-01-01
  • 2021-12-02
  • 2014-03-22
  • 1970-01-01
相关资源
最近更新 更多