2016-02-25 56 views
1

我有这样的DocumentDB为了在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操作者采取()初始查询,我失去了在结果的一些元素。 为什么?

+0

您的原始回复有4个结果。您为Take指定了什么值?如果它小于4,你显然会得到更少的结果。 –

回答

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(); 
+0

我已经尝试了FeedOptions参数,但结果是一样的。如果我有16个文档的连接结果,如您所说,应用Take操作符或FeedOptions参数,获取最多10个结果,并按顺序,我采用第一个和第二个文档,然后跳过一些下一个文档,然后检索其他下一个文件。 – Matteo

+0

我以为这就是你想达到的。我现在明白,你想要的是在发生连接之前应用Take on the Documents **,所以10的结果可能会有40个结果(如果每个文档有4个日志),那是正确的吗? –

+0

我已经解决了这个问题。真的这不是一个真正的问题,因为根据文档的结构,从DocumentDB设置的结果是正确的。我花了很多时间分析结果,然后我看到这是一个正确的结果。 – Matteo

0

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

+0

我在第一个查询的.AsDocumentQuery调用之前立即执行Take。 – Matteo