我只需要在 CosmosDb 中使用 LINQ 比较 DateTime 中的 Date。但这是行不通的。以下是我的代码示例:
在 .Where(x => x.Date.Date == date.Date) 中,正如我猜测的那样,这没有正确评估。我还发现之前的一些文章提到 LINQ 中的 CosmosDb 不支持 DateTime。现在还是这样吗?或者说,还有其他的可能吗?
public async Task<IEnumerable<Milking>> hasAlreadyExistsForThisDate(DateTime date)
{
var query = _milkingContainer.GetItemLinqQueryable<Milking>()
.Where(x => x.Date.Date == date.Date)
.ToFeedIterator();
var milkings = new List<Milking>();
while (query.HasMoreResults)
{
var response = await query.ReadNextAsync();
milkings.AddRange(response);
}
return milkings;
}
数据库(Azure CosmosDb):
{
"id": "7e7614ed-d9df-45db-aaee-5586e05dc300",
"date": "2023-12-26T18:33:57.703Z",
"pegs": [
125,
120,
80
],
"_rid": "rn5YAIalsYoMAAAAAAAAAA==",
"_self": "dbs/rn5YAA==/colls/rn5YAIalsYo=/docs/rn5YAIalsYoMAAAAAAAAAA==/",
"_etag": "\"00000000-0000-0000-382a-2a71928201da\"",
"_attachments": "attachments/",
"_ts": 1703615671
}
CosmosDB 没有 DateTime 类型,日期以 ISO8601 格式存储为字符串,带有一点额外的“魔力”。我怀疑这不涉及截断时间部分,或者更确切地说,将
转换为范围查询。将条件更改为等效的.Date=.Date
x.Date >= date.Date && x.Date < date.Date.AddDays(1)
正如 Panagiotis Kanavos 在评论中所说,在 Cosmos DB 中查询日期的推荐方法是使用范围查询。下面是使用相同方法使用 LINQ 比较来自
DateTime
的日期的代码。
using (var cosmosClient = new CosmosClient(endpointUrl, primaryKey))
{
var database = cosmosClient.GetDatabase(databaseId);
var container = database.GetContainer(containerId);
var ordersQuery = container.GetItemLinqQueryable<Order>(allowSynchronousQueryExecution: true)
.Where(x => x.ShipDate >= targetDate.Date && x.ShipDate < targetDate.Date.AddDays(1));
var filteredOrders = ordersQuery.ToList();
Console.WriteLine("Filtered Orders:");
foreach (var order in filteredOrders)
{
Console.WriteLine($"Order ID: {order.OrderId}, Ship Date: {order.ShipDate}");
}
}
它检查之前和之后日期之间的日期,而不是检查单个日期并从容器中检索匹配的日期。上述代码中的targetDate是与cosmos db容器中存储的ShipDate进行比较。以下是使用 LINQ 比较
DateTime
中的日期后的输出。
在我的 azure cosmos db 容器中获取的示例输入:
[
{
"OrderId": 1,
"ShipDate": "2024-01-18T10:30:00Z",
"id": "c20dff36-2971-407e-a856-c8b9bd284626"
},
{
"OrderId": 2,
"ShipDate": "2024-01-21T15:45:00Z",
"id": "452a9a12-5e94-4bec-a20d-e0447b2c2e90"
},
{
"OrderId": 3,
"ShipDate": "2024-01-19T08:00:00Z",
"id": "1dea9ba8-c49b-486f-8dd8-bfe9bafddfff"
}
]
输出:
Filtered Orders:
Order ID: 2, Ship Date: 1/21/2024 3:45:00 PM