gpt4 book ai didi

c# - Cosmos DB DocumentClient 的 DateTime 处理中的错误

转载 作者:行者123 更新时间:2023-12-03 17:11:14 26 4
gpt4 key购买 nike

这个问题与 DocumentClient 中的 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 的结果确实 不包括 文件,其中 datetime"2000-01-01T00:00:00.1234560Z" (即使它 应该是 )。
有什么方法可以使用 DocumentClient 和 LINQ 来正确查询 DateTime 属性? (我知道使用原始 SQL 是有效的 - 由于各种原因,我 必须 使用 LINQ/ IQueryable 。)

最佳答案

解决方法是使用自定义 JsonConverter .不幸的是,与 DocumentClient ,设置 JsonConverterDocumentClient 的构造函数中不是 工作!转换器仅在全局(静态)JSON.NET 默认设置 ( JsonConvert.DefaultSettings ) 中指定时才能正确拾取。
对于较新的 CosmosClient , 设置自定义 CosmosSerializer 是必要且充分的在构造函数中。写自定义 CosmosSerializer它允许您指定自定义 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
}

关于c# - Cosmos DB DocumentClient 的 DateTime 处理中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63112044/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com