2016-02-25 5 views
1

в DocumentDB Я некоторые документы, как этотDocumentDB заказ по результатам

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

Я сделал этот запрос LINQ в C#:

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(), указывающим предел для извлекаемых элементов, я потерял некоторые элементы в результате. Почему?

+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 of 10» может достигнуть 40 результатов (если у каждого документа было 4 журнала), правильно? –

+0

Я решил проблему. На самом деле это не проблема, потому что результаты, установленные в DocumentDB, верны в соответствии со структурой документов. Я потратил много времени на анализ результатов, тогда я увидел, что это правильный результат. – Matteo

0

Возможно, вы положили заявку до своего заказа. В этом случае берут некоторые элементы из неупорядоченного результата и происходит упорядочение. Если вы сделаете заказ после заказа, вы получите набор из упорядоченных элементов. Скорее всего, вы ожидали результата.

+0

Я поставил Take непосредственно перед вызовом .AsDocumentQuery по первому запросу. – Matteo