DocumentDB按结果排序

时间:2016-02-25 17:45:42

标签: azure azure-cosmosdb

在DocumentDB中我有一些像这样的文件

{
  "Code": "123456",
  "ScanLog": [
    {
      "TimeStamp": 20160224115507
    },
    {
      "TimeStamp": 20160224115641
    }
  ]
  "LastScanTimeStamp": 20160224115641
}

我在C#中创建了这个LINQ查询:

   var Query = client.CreateDocumentQuery().OrderByDescending(c => c.LastScanTimeStamp).SelectMany(a => a.ScanLog.Select(b => new { Code = a.Code, TimeStamp = b.TimeStamp })).AsDocumentQuery();
   var feedResp = await Query.ExecuteNextAsync();

这就是结果:

[
  {
    "Code": "123456",
    "TimeStamp": 20160224115507
  },
  {
    "Code": "123456",
    "TimeStamp": 20160224115641
  },
  {
    "Code": "abcdef",
    "TimeStamp": 20160224101641
  },
  {
    "Code": "abcdef",
    "TimeStamp": 20160224105641
  }
]

对于这个结果,我以这种方式申请另一个订单:

feedResp.OrderByDescending(a => a.TimeStamp).AsEnumerable();

回复是:

[
  {
    "Code": "123456",
    "TimeStamp": 20160224115641
  },
  {
    "Code": "123456",
    "TimeStamp": 20160224115507
  },
  {
    "Code": "abcdef",
    "TimeStamp": 20160224105641
  },
  {
    "Code": "abcdef",
    "TimeStamp": 20160224101641
  }
]

现在,如果我使用LINQ运算符Take()指定检索项的限制进行初始查询,我在结果中丢失了一些元素。 为什么?

2 个答案:

答案 0 :(得分:1)

使用此查询,您可以使用相同的文档实现JOIN,这意味着如果您有4个文档,每个文档有4个日志,则您有16个文档。

Linq动态创建查询,也许正在发生的事情是Take正在对文档而不是查询结果。

我要尝试的是在文档查询中使用FeedOptions并指定我想在那里获得的最大结果数。

var Query = client.CreateDocumentQuery("my_collection_uri",new FeedOptions(){MaxItemCount=4}).OrderByDescending(c => c.LastScanTimeStamp).SelectMany(a => a.ScanLog.Select(b => new { Code = a.Code, TimeStamp = b.TimeStamp })).AsDocumentQuery();
var feedResp = await Query.ExecuteNextAsync();

答案 1 :(得分:0)

你可能已经把订单放在了订单之前。在这种情况下,take取得了无序结果中的一些元素,而不是排序。如果您在订单后执行收盘操作,您将从订购的元素中获取该集合。这可能是你期望的结果。