Запрос MongoDB в C# от MongoDBRef - PullRequest
1 голос
/ 23 марта 2020

Я пытаюсь получить все фотографии пользователя, запрашивая его по идентификатору пользователя. (Я знаю о встроенных документах в понедельник go, но я бы хотел использовать их именно так).

Вот ошибка, которую я получаю: "System.InvalidOperationException: '{UserId.$id}.ToString() is not supported'"

public ICollection<Photo> GetAllUserPhotos(string userId)
{
  var photos = _photos.Find(photo => photo.UserId.Id.ToString() == userId);
  var photoListTest = photos.ToList() // here I get the error
  return photoListTest;
}

Такой «нормальный» запрос работает без проблем:

public List<User> GetAllUsers() => _users.find(user => true).ToList();

Вот мои модели:

    public class User
    {
        [BsonRepresentation(BsonType.ObjectId)]
        [BsonId]
        public string Id { get; set; }

        public string Name { get; set; }
    }
    public class Photo
    {
        [BsonRepresentation(BsonType.ObjectId)]
        [BsonId]
        public string Id { get; set; }

        public MongoDBRef UserId { get; set; }
    }

1 Ответ

2 голосов
/ 24 марта 2020

Проблема здесь в том, что метод .Find() принимает Expression<T,bool> в качестве параметра, а затем при нажатии .ToList() драйвер MongoDB пытается преобразовать такое выражение в язык запросов / агрегации MongoDB. Драйвер MongoDB. NET не понимает {UserId.$id}.ToString(), и поэтому вы получаете исключение.

Чтобы исправить это, попробуйте другой способ - преобразовать переменную в памяти в тип, который хранится в базе данных попробуйте:

var userIdConverted = ObjectId.Parse(userId); // or use string if it's string in your database 
var dbRef = new MongoDBRef("colName", userIdConverted); 
var photos = _photos.Find(photo => photo.UserId.Id.ToString() == dbRef );
...