2015-08-22 2 views
1

Я хотел бы иметь возможность использовать Windows Form с MongoDB при использовании POCO, главным образом потому, что легко получить значения из MongoDB в строковых литералах. Единственная проблема, с которой я сталкиваюсь, заключается в том, что POCO берет пустые записи из форм Windows как пустую строку (""), поэтому при использовании InsertOneAsync() я вижу поля со значениями "".MongoDB и Windows Forms с использованием POCO

Это вообще не желательно, главным образом потому, что:

  1. Он занимает пространство в коллекции, и
  2. Я хотел бы сделать запросы, используя форму самой Windows. Если у запросов есть «», в одном поле в документе Mongo это не «» (не пустая строка), то оно ничего не вернет, потому что строки не совпадают.

Ниже мой код для импортирования документа из формы Windows для MongoDB .. Некоторые другие вопросы, я имел:

  • Использование «нуль» просто создает поле со значением нуль. Моя цель - просто не создавать поле.
  • код, который у меня есть для ZIP, преобразует значение «null» в «0». Я бы хотел изменить это так, чтобы он просто не входил в поле, когда запись в форме окна пуста.

    var person = new Person 
        { 
         lastName = textBox1.Text.ToUpper(), 
         firstName = textBox8.Text.ToUpper(), 
         address = new Address 
         { 
          streetAddress = textBox4.Text.ToUpper(), 
          city = textBox5.Text.ToUpper(), 
          state = comboBox1.Text.ToUpper(), 
          ZIP = Convert.ToInt32(string.IsNullOrEmpty(textBox7.Text) ? null : textBox7.Text) 
         } 
        }; 
    
        var client = new MongoClient(); 
        var database = client.GetDatabase("dataBase"); 
        var col = database.GetCollection<Person>("addressBook"); 
    
        await col.InsertOneAsync(person); 
    

P.S. это мой первый вопрос здесь, поэтому, пожалуйста, дайте мне знать, если я не предоставил достаточную информацию.

ответ

0

Итак, после небольшого поиска души, похоже, POCO не идеален для многопользовательских запросов.

Лучший способ сделать запрос - использовать общий тип BsonDocument, а затем преобразовать найденный документ в родовой тип «человек». Пример код размещен здесь:

var doc = new BsonDocument(); // Creating a filter for me in BSON 

var lastName = textBox1.Text; 
if (lastName != "") // Is my string in the Windows Form empty? 
    doc.Add("lastName", lastName); // If not, add me to the filter. 

var firstName = textBox8.Text; 
if (firstName != "") 
    doc.Add("firstName", firstName); 

Если строка символов не является пустой, то он добавляет поле и соответствующее значение в BsonDocument, который будет использоваться в качестве фильтра.

var doc = await colBson.Find(filter).FirstOrDefaultAsync(); 
// Find me, but as a BSON document. 

Документ затем определяется как документ BsonDocument.

var person = BsonSerializer.Deserialize<Person>(doc); 
// Convert me into a <Person> generic type. 

Отсюда вы можете сделать то, что пожелаете, с помощью класса «Человек».

Пожалуйста, дайте мне знать, если я ничего не понял.

Смежные вопросы