使用枚举作为过滤器的documentdb查询

时间:2017-03-02 21:36:56

标签: azure-cosmosdb

我在下面的查询(带有完整代码)时,如果符合该条件的面行中没有返回任何数据。 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())

但是这也不起作用,我得到一个错误&#34; Method&#39; ToString&#39;不受支持。&#34;

编辑2:纠正错误,我打算在上面的编辑中说我有.ToString()

编辑3: 更多信息:

我正在使用默认序列化在文档中使用camel大小写

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

这也会在驼峰套管中转换所有列。

LINQ生成的实际查询低于 -

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

因此存在列不匹配&#34;状态&#34; vs&#34; state&#34;。

以下是文档db

中的示例文档
{
"id": "2017-03-02T22:00:00Z",
"state": "ToProcess"
}

2 个答案:

答案 0 :(得分:1)

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

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

<强> RESULT

enter image description here

答案 1 :(得分:0)

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