C # Azure MongoDB Linq возле запроса - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь отправить запрос с точкой местоположения в Azure Cosmos DB (MongoDB) и получить местоположения рядом с этой точкой.Я получил большую часть информации от здесь .И я использую Microsoft.Azure.Documents.Spatial;.

До сих пор я пробовал много решений других старых постов, и у меня ничего не получалось.

Мое определение класса:

 public class Place : INotifyPropertyChanged
{
    [BsonId(IdGenerator = typeof(CombGuidGenerator))]
    public Guid Id { get; set; }

    Point _location;
    [BsonElement("Location")]
    public Point Location
    {
        get => _location;
        set
        {
            if (_location == value)
                return;

            _location = value;

            HandlePropertyChanged();
        }
    }

    long _addedDate;
    [BsonElement("AddedDate")]
    public long AddedDate
    {
        get => _addedDate;
        set
        {
            if (_addedDate == value)
                return;

            _addedDate = value;

            HandlePropertyChanged();
        }
    }

    void HandlePropertyChanged([CallerMemberName]string propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

Монго соединение:

 // APIKeys.Connection string is found in the portal under the "Connection String" blade
                MongoClientSettings settings = MongoClientSettings.FromUrl(
                  new MongoUrl(APIKeys.ConnectionString)
                );

                settings.SslSettings =
                    new SslSettings() { EnabledSslProtocols = SslProtocols.Tls12 };

                // Initialize the client
                var mongoClient = new MongoClient(settings);

                // This will create or get the database
                var db = mongoClient.GetDatabase(dbName);

                // This will create or get the collection
                var collectionSettings = new MongoCollectionSettings { ReadPreference = ReadPreference.Nearest };
                PlacesCollection = db.GetCollection<Place>(collectionName, collectionSettings);

Запрос:

var point = new Point(22, -5);
IMongoQueryable<Place> query = PlacesCollection.AsQueryable().Where(p => p.Location.Distance(point) < 30000);

return query.ToList();

Я получаю следующую ошибку в return query.ToList():

Необработанное исключение:

System.InvalidOperationException: {document} {Location} .Distance (значение (Microsoft.Azure.Documents.Spatial.Point)) не поддерживается.

Я не понимаючто не поддерживается ни как создать правильный запрос для этого.Есть идеи?

Редактировать: стек вызовов

0xE0 in XamFormsMaps.Core.Services.MongoService.GetPlacesNear at C:\Users\Role\source\repos\XamFormsMaps\XamFormsMaps\XamFormsMaps.Core\Services\MongoService.cs:84,13  C#
[External Code] 
0x20 in XamFormsMaps.Core.Services.DatabaseService.GetPlacesNear at C:\Users\Role\source\repos\XamFormsMaps\XamFormsMaps\XamFormsMaps.Core\Services\DatabaseService.cs:20,13    C#
0x7A in XamFormsMaps.Core.ViewModels.MapViewModel.GetPlacesAsync at C:\Users\Role\source\repos\XamFormsMaps\XamFormsMaps\XamFormsMaps.Core\ViewModels\MapViewModel.cs:112,17    C#
0x6D in XamFormsMaps.Core.Pages.MapPage.<-ctor<-ctor>b__0_1>d at C:\Users\Role\source\repos\XamFormsMaps\XamFormsMaps\XamFormsMaps.Core\Pages\MapPage.xaml.cs:27,17 C#

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Есть ли у вас трассировка стека исключения, которое вы имели до вашего решения?Я хотел бы посмотреть, в чем проблема.

0 голосов
/ 18 сентября 2018

решаемая. Сначала мне пришлось изменить тип местоположения в модели:

GeoJsonPoint<GeoJson2DGeographicCoordinates> _location;
    [BsonElement("Location")]
    public GeoJsonPoint<GeoJson2DGeographicCoordinates> Location
    {
        get => _location;
        set
        {
            if (_location == value)
                return;

            _location = value;

            HandlePropertyChanged();
        }
    }

Затем я использовал следующий запрос:

var geoPoint = new GeoJsonPoint<GeoJson2DGeographicCoordinates>(new GeoJson2DGeographicCoordinates(22, -5));
var query = Builders<Place>.Filter.Near(p => p.Location, geoPoint, 30000);
var result = await PlacesCollection.Find(query).ToListAsync();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...