DocumentDB 按结果排序

DocumentDB order by results

在 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 运算符 Ta​​ke() 进行初始查询并指定检索项的限制,我会在结果中丢失一些元素。 为什么??

您可能已经在点菜之前先拍了。在这种情况下,take 从无序结果中获取一些元素,然后进行排序。如果您在订购后进行取货,您将从订购的元素中获得集合。这可能是您所期望的结果。

通过此查询,您实现了包含相同文档的 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();