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 运算符 Take() 进行初始查询并指定检索项的限制,我会在结果中丢失一些元素。
为什么??
您可能已经在点菜之前先拍了。在这种情况下,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();
在 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() 进行初始查询并指定检索项的限制,我会在结果中丢失一些元素。 为什么??
您可能已经在点菜之前先拍了。在这种情况下,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();