使用枚举作为过滤器的 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;}
}
结果
当面行中有符合该条件的行时,我有以下查询(带有完整代码)不返回任何数据。 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;}
}
结果