DocumentDb Spatial Distance в Linq возвращает странный результат

Когда я выполняю запрос расстояния 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;
}

person hendrikdelarey    schedule 20.08.2015    source источник
comment
Я не могу воспроизвести эту проблему с этими данными. Не могли бы вы указать значение радиуса. Идентификаторы активности также помогут.   -  person Aravind Krishna R.    schedule 21.08.2015
comment
Это связано с ошибкой в ​​SDK DocumentDB при построении запросов LINQ to SQL в языковых стандартах, отличных от EN: github.com/Azure/azure-documentdb-net/issues/49. Исправление будет в ближайшее время.   -  person Aravind Krishna R.    schedule 23.08.2015
comment
мы считаем, что исправили эту проблему, но хотели бы подтвердить. Вы можете предоставить репродукционный проект? вы работаете с культурной информацией, отличной от en-US или даже en-ZA (как я вижу, вы из Каапстада)   -  person Ryan CrawCour    schedule 25.08.2015
comment
мы опубликовали 1.4.1 пакета SDK для .NET. не могли бы вы проверить и посмотреть, решает ли это вашу проблему. пожалуйста, сообщите сюда. Спасибо.   -  person Ryan CrawCour    schedule 25.08.2015
comment
@RyanCrawCour-MSFT Спасибо за обновление. Да, я использую en-ZA CultureInfo (действительно, Кейптаун :)). Теперь проблема изменилась. Я отредактирую вопрос, чтобы отразить изменение.   -  person hendrikdelarey    schedule 25.08.2015
comment
@RyanCrawCour-MSFT Теперь все работает как часы! Спасибо, что ответили здесь. Между прочим, ваш курс MVA действительно принес пользу .. так держать!   -  person hendrikdelarey    schedule 25.08.2015


Ответы (1)


Это произошло из-за ошибки (теперь исправленной) в SDK DocumentDB при построении запросов LINQ to SQL в языковых настройках, отличных от EN: https://github.com/Azure/azure-documentdb-net/issues/49..

person Aravind Krishna R.    schedule 20.08.2015
comment
Хорошая точка зрения. Это вполне может быть. К сожалению, у Point нет .ToString(), но я отредактировал, чтобы включить двойные значения. Другое дело, что я точно знаю, что расстояние между test[0].Point и точкой меньше радиуса (точки - это те же плавающие значения), поэтому я не могу понять, почему он не возвращает точки в этом радиусе. Я думаю, что я, должно быть, что-то в корне неправильно понимаю. - person hendrikdelarey; 21.08.2015
comment
Это не дает ответа на вопрос. Чтобы подвергнуть критике или запросить разъяснения у автора, оставьте комментарий под его публикацией. - person Jan Aagaard Meier; 21.08.2015
comment
@JanAagaardMeier поправьте меня, если я ошибаюсь, это действительно отвечает на вопрос. мы заявили, что проблема связана с ошибкой в ​​SDK. - person Ryan CrawCour; 25.08.2015