#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;
}