Класс отображения C # MongoDB

#c# #.net #mongodb #mongodb-.net-driver

#c# #.net #mongodb #mongodb-.net-driver

Вопрос:

Привет, я действительно борюсь с классами и отображением документа MongoDB, я признаю, что я изо всех сил пытаюсь понять всю суть ООП, и мое кодирование на данный момент ограничено только функциональным кодированием. В моем документе много полей, но на данный момент меня интересуют только некоторые из них. Я написал свою программу на Python без классов, но я хочу воссоздать ее на C #.

Мой код на Python, который возвращает два поля.

  stock_details = collection.find_one({'Stock Number' : stock_number})
        #print(stock_details.keys()) 
        val1 = stock_details['Stock Number']
        val2 = stock_details['Qty In Stock']

        return val1, val2,
  

Мой код на C #, с которым я борюсь

  public static StockItem GetStockItem(string StockNumber)
    {
        var client = new MongoClient()
        var db = client.GetDatabase("storesdb");
        var collection = db.GetCollection<BsonDocument>("storeslist");
        var filter = Builders<StockItem>.Filter.Eq("Stock Number", StockNumber);
        var findfilter = collection.Find(filter).FirstOrDefault();
        var returnValue = findfilter;
        return returnValue;
    }


    [BsonIgnoreExtraElements]
    public class StockItem
    {
        [BsonElement("Stock Number")]
        public string stockNumber { get; set; }

        [BsonElement("Qty In Stock")]
        public int qtyInStock { get; set; }

    }
  

Я могу успешно получить документ Bson, но когда я пытаюсь использовать класс, я не могу сопоставить его с переменной / объектом, попытка приведенного выше кода выдает следующую ошибку.

 Severity    Code    Description Project File    Line    Suppression State
Error   CS1503  Argument 2: cannot convert from 'MongoDB.Driver.FilterDefinition<Program.StockItem>' to 'System.Linq.Expressions.Expression<System.Func<MongoDB.Bson.BsonDocument, bool>>'  Storesincsharp  C:UserszakssourcereposStoresincsharpStoresincsharpProgram.cs 46  Active
  

Изменение фильтра документа на Bson работает нормально, но попытка вернуть его как объект класса вместо этого выдает эту ошибку.

 Severity    Code    Description Project File    Line    Suppression State
Error   CS0029  Cannot implicitly convert type 'MongoDB.Bson.BsonDocument' to 'Program.StockItem'   Storesincsharp  C:UserszakssourcereposStoresincsharpStoresincsharpProgram.cs 48  Active
  

Может ли кто-нибудь указать мне правильное направление?

Комментарии:

1. вы должны создать типизированную коллекцию. Вместо этого: var collection = db.GetCollection<BsonDocument>("storeslist"); попробуйте это: var collection = db.GetCollection<StockItem>("storeslist");

Ответ №1:

Вы захотите использовать типизированную коллекцию. Кроме того, чтобы избежать опечаток, вы также можете указать имена своих фильтров через linq, а не с помощью имен строк. Это также помогает при рефакторинге ваших классов. Пример:

     public static StockItem GetStockItem(string StockNumber)
    {
        var client = new MongoClient();
        var db = client.GetDatabase("storesdb");
        var collection = db.GetCollection<StockItem>("storeslist");  // Typed collection.
        var filter = Builders<StockItem>.Filter.Eq(x=> x.stockNumber, StockNumber); // Referenced property name.
        StockItem returnValue = collection.Find(filter).FirstOrDefault();
        return returnValue;
    }