首页 > 解决方案 > Cosmos DB DocumentClient 的 DateTime 处理中的错误

问题描述

这个问题与DocumentClientfrom相关Microsoft.Azure.DocumentDB.Core v2.11.2。(更新:该错误也存在于Microsoft.Azure.Cosmos。)

DateTime当查询包含带有尾随零的值时,Cosmos DB 的 LINQ 提供程序中似乎存在错误。考虑以下代码:

string dateTimeWithTrailingZero = "2000-01-01T00:00:00.1234560Z"; // trailing zero will be truncated by LINQ provider :-(
DateTime datetime = DateTime.Parse(dateTimeWithTrailingZero, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);

IQueryable<Dictionary<string, object>> query =
    client.CreateDocumentQuery<Dictionary<string, object>>(collectionUri)
        .Where(x => (DateTime) x["datetime"] <= datetime);

的结果query 包括属性所在的文档,datetime例如"2000-01-01T00:00:00.1234567Z"(即使它不应该)。

的结果query包括文档 where datetimeis "2000-01-01T00:00:00.1234560Z"(即使它应该)。

有什么方法可以使用DocumentClient和 LINQ 来DateTime正确查询属性吗?(我知道使用原始 SQL 是可行的——出于各种原因,我必须使用 LINQ/ IQueryable。)

标签: c#azure-cosmosdbazure-cosmosdb-sqlapi

解决方案


一种解决方法是使用自定义JsonConverter. 不幸的是,在 的构造函数DocumentClient设置不起作用!只有在全局(静态)JSON.NET 默认设置 ( ) 中指定转换器时,才能正确拾取转换器。JsonConverterDocumentClientJsonConvert.DefaultSettings

对于较新CosmosClient的,在构造函数中设置自定义是必要且足够CosmosSerializer的。要编写CosmosSerializer允许您指定 custom 的 custom JsonSerializerSettings,您可以反编译内部类CosmosJsonDotNetSerializer并将其用作基础。

自定义JsonConverter如下所示:

/// <summary>
/// <see cref="JsonConverter" /> for Cosmos DB needed as long as the DateTime handling
/// problem has not been fixed. 
/// </summary>
public class CosmosDbDateTimeJsonConverter : IsoDateTimeConverter
{
    public CosmosDbDateTimeJsonConverter()
    {
        this.DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK";
    }

    #region Overrides of JsonConverter

    /// <inheritdoc />
    public override bool CanRead => false;

    #endregion
}

推荐阅读