DocumentDB仿真器在Linq查询上崩溃

时间:2017-05-21 21:14:11

标签: c# linq emulation azure-cosmosdb

我刚开始使用DocumentDB / Cosmos并遇到了错误,我不确定它是我做的还是错误。为了便于测试,我使用的是DocumentDB仿真器V1.13.58.2和C#DocumentDB SDK V1.14.0。

在我尝试执行Linq查询之前,一切正常,我在除了id之外的文档属性上进行了相等性测试。如果我使用id,它可以工作,否则DocumentDB服务器崩溃。我还尝试降级到SDK的V1.13.4并抛出异常“解析值时遇到意外字符:≻。路径'',第0行,位置0”。

以下是我用来创建问题的代码。

首先,我创建了一个简单的类,然后我将一些实例添加到db中。我可以看到在文档资源管理器中使用正确的分区成功创建了文档。

public class TestEntityClass
{
    [JsonProperty(PropertyName = "id")]
    public Guid Id { get; set; }
    [JsonProperty(PropertyName = "type")]
    public int DocumentType { get; set; }
    [JsonProperty(PropertyName = "pId")]
    public string PartitionId { get; set; }
    [JsonProperty(PropertyName = "stringProperty")]
    public string StringProperty { get; set; }
    [JsonProperty(PropertyName = "numberProperty")]
    public int NumberProperty { get; set; }
}

然后我尝试使用linq查询DB,其中“match”是Linq表达式。

using (var query = m_Client.CreateDocumentQuery<TObject>(UriFactory.CreateDocumentCollectionUri(m_DBName, m_ColName),
            new FeedOptions() { MaxItemCount = 1 }).Where(m => m.PartitionId == PartitionId && m.DocumentType == m_Type)
            .Where(match).AsDocumentQuery())
        {
            var response = await query.ExecuteNextAsync<TObject>();
            if (response.Count == 0) { return null; }
            return response.ElementAt(0);
        }

当我将匹配设置为

match = m => m.Id == entity1.Id;

它工作正常。

但是如果我将匹配设置为

match = m => m.NumberProperty == entity1.NumberProperty;

match = m => m.StringProperty == entity1.StringProperty;

DocumentDb服务器崩溃。

现在所有这些在我的云托管Cosmos数据库上工作正常,所以这不是一个大问题,但我只是好奇,如果它是我正在做的事情或只是一个错误。如果有人有任何见解我会非常感激。感谢。

1 个答案:

答案 0 :(得分:0)

我创建了一个控制台应用程序并连接到Azure Cosmos DB Emulator实例,我可以根据id属性和其他属性查询和过滤文档。

Class TestEntityClass(与你的相同):

public class TestEntityClass
{
    [JsonProperty(PropertyName = "id")]
    public Guid Id { get; set; }
    [JsonProperty(PropertyName = "type")]
    public int DocumentType { get; set; }
    [JsonProperty(PropertyName = "pId")]
    public string PartitionId { get; set; }
    [JsonProperty(PropertyName = "stringProperty")]
    public string StringProperty { get; set; }
    [JsonProperty(PropertyName = "numberProperty")]
    public int NumberProperty { get; set; }
}

packages.config

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.Azure.DocumentDB" version="1.14.0" targetFramework="net45" />
  <package id="Newtonsoft.Json" version="6.0.8" targetFramework="net45" />
</packages>

enter image description here

注意:如果跨分区执行查询,请设置EnableCrossPartitionQuery = true

请尝试使用TestEntityClass中的CreateDocumentQuery<TestEntityClass>代替CreateDocumentQuery<TObject>,并检查是否出现相同的错误。