c# - Cosmos DB DocumentClient 的 DateTime 处理中的错误
问题描述
这个问题与DocumentClient
from相关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 datetime
is "2000-01-01T00:00:00.1234560Z"
(即使它应该)。
有什么方法可以使用DocumentClient
和 LINQ 来DateTime
正确查询属性吗?(我知道使用原始 SQL 是可行的——出于各种原因,我必须使用 LINQ/ IQueryable
。)
解决方案
一种解决方法是使用自定义JsonConverter
. 不幸的是,在 的构造函数中DocumentClient
设置不起作用!只有在全局(静态)JSON.NET 默认设置 ( ) 中指定转换器时,才能正确拾取转换器。JsonConverter
DocumentClient
JsonConvert.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
}
推荐阅读
- opengl - 带计算着色器的环形缓冲 SSBO
- dart - 我正在使用 BottomNavigationBar 导航到 diff SliverList。我观察到它不会保留到我滚动的最后一行。我怎样才能解决这个问题?
- java - 在嵌入式 tomcat 中部署为 ROOT
- jquery - (jQuery) 添加文本会清除 div 中的所有其他内容
- javascript - 在 Vue 实例中手动监听鼠标事件
- api - 改造 2 获取 Github 用户 API 总是返回 null
- python - 为什么权重不会改变 sci-kit 学习包中的 K-mean 聚类中心位置?
- javascript - 需要修改 javascript 代码以在循环中运行不同的生成函数
- docker - 在 docker 映像上显式更改 go 路径
- typescript - 我在 typescript 中返回哪种类型的 AWS lambda 响应以适应 AWS APIGateway 方法响应?