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

documentdb query using enums as filter

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

但这也不起作用,我得到一个错误 "Method 'ToString' is not supported."

编辑 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"
}

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

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

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

结果