Mo *_* B. 5 c# azure-cosmosdb azure-cosmosdb-sqlapi
这个问题与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);
Run Code Online (Sandbox Code Playgroud)
结果query 包括属性所在的文档,datetime例如"2000-01-01T00:00:00.1234567Z"(即使它不应该)。
结果query并没有包含文件,其中datetime是"2000-01-01T00:00:00.1234560Z"(即使它应该)。
有什么方法可以使用DocumentClientLINQ 来DateTime正确查询属性吗?(我知道使用原始 SQL 是有效的 - 由于各种原因,我必须使用 LINQ/ IQueryable。)
解决方法是使用自定义JsonConverter. 不幸的是,对于,在 的构造函数中DocumentClient设置不起作用!仅当在全局(静态)JSON.NET 默认设置 ( ) 中指定转换器时,才会正确选择转换器。JsonConverterDocumentClientJsonConvert.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
}
Run Code Online (Sandbox Code Playgroud)