Когда я выполняю запрос расстояния documentdb linq для двух одинаковых точек (Microsoft.Azure.Documents.Spatial), я получаю разные результаты.
Ниже тест возвращает список, содержащий один LocationDocument. test2 возвращает пустой список. Однако isEqual bool возвращает true, поэтому я не могу понять, почему они возвращают разные результаты. У меня есть ручное подтверждение того, что долгота и широта также совпадают.
// one document
var test = MyCollectionRepository<LocationDocument>
.GetItems(x => x.Point.Distance(x.Point) < radius)
.ToList();
// no documents
var test2 = MyCollectionRepository<LocationDocumentDocument>
.GetItems(x => x.Point.Distance(point) < radius)
.ToList();
// true
bool isEqual = point.Equals(test[0].Point);
Вот метод GetItems(), вызываемый из репозитория:
public static IReadOnlyCollection<T> GetItems(Expression<Func<T, bool>> predicate)
{
var items = Client.CreateDocumentQuery<T>(Collection.DocumentsLink)
.Where(predicate)
.ToList();
return items;
}
Кто-нибудь знает, почему это происходит? Это не самая простая вещь для отладки, поскольку вызовы Distance доступны только при запуске в качестве запроса в documentdb.
Заранее спасибо.
Точечный объект:
point.Position.Latitude.ToString(); //18.4239
test[0].Point.Position.Latitude.ToString(); //18.4239
point.Position.Longitude.ToString(); //-33.9253
test[0].Position.Longitude.ToString(); //-33.9253
Отредактировано:
Я обновил библиотеку Microsoft.Azure.DocumentDB (1.4.1) до последней версии, и проблема изменилась. Как упоминалось в комментариях, проблема, похоже, связана с моими настройками CultureInfo. У меня неамериканская культура (точнее, en-ZA).
Затем test2 выдавал исключение, в то время как test1 все еще выдавал ожидаемый результат. Я получал AggregateException. Затем мне просто нужно было добавить в заголовок включение сканирования в запросе. Ниже показано, как это сделать:
public static IReadOnlyCollection<T> GetItems(Expression<Func<T, bool>> predicate)
{
var items = Client.CreateDocumentQuery<T>(Collection.DocumentsLink, new FeedOptions { EnableScanInQuery = true })
.Where(predicate)
.ToList();
return items;
}