如何在 C# 中使用 LINQ 比较 CosmosDb 中的 DateTime 的日期

问题描述 投票:0回答:1

我只需要在 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
}
c# .net linq azure-cosmosdb
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.