Как я могу добавить документы Couchbase в список?

Я экспериментирую с Couchbase + Xamarin.Forms, пытаясь сделать простой поиск, показывая результаты в ListView, но я застрял. Кто-нибудь знает, как добавить строки / документы запроса в список?

public List<Visitor> SearchRecord (string word)
{
   var viewByName = db.GetView ("ByName");
   viewByName.SetMap((doc, emit) => {
     emit (new object[] {doc["first_name"], doc["last_name"]}, doc);
   }, "2");

   var visitorQuery = viewByName.CreateQuery();

   visitorQuery.StartKey = new List<object> {word};
   // visitorQuery.EndKey = new List<object> {word, new Dictionary<string, object>()};
   visitorQuery.Limit = 100;

   var visitors = visitorQuery.Run();
   var visitorList = new List<Visitor> ();

   foreach (var visitor in visitors) {
     // visitorList.Add(visitor.Document); <-- Error.
     System.Console.WriteLine(visitor.Key);
   }

   return visitorList;
}

Я получаю сообщения об ошибках:

Ошибка CS1501: нет перегрузки для метода Add' takes2'аргумента (CS1501) (Demo_Couchbase.Droid) Ошибка CS1502: лучший перегруженный метод соответствует System.Collections.Generic.List<Demo_Couchbase.Visitor>.Add(Demo_Couchbase.Visitor)' has some invalid arguments (CS1502) (RegistroAgil_Couchbase.Droid) Error CS1503: Argument#1'не может конвертировать Couchbase.Lite.Document' expression to typeDemo_Couchbase.Visitor' (CS1503) (Demo_Couchbase.Droid)

Заранее благодарю за любую помощь, которую вы можете оказать.

2 ответа

В вашей картографической части есть проблема. Вы можете напрямую преобразовывать документы в GetView. Вы можете попробовать приведенный ниже код.

 public List<Visitor> SearchRecord (string word)
{
   var viewByName = db.GetView<Visitor>("ByName","ByName");
   var visitorQuery = viewByName.CreateQuery();
   visitorQuery.StartKey = new List<object> {word};
   visitorQuery.Limit = 100;
   var visitors = visitorQuery.Run();
   var visitorList = new List<Visitor> ();

   foreach (var visitor in visitors) {
     visitorList.Add(visitor.Document); 
     System.Console.WriteLine(visitor.Key);
   }
   return visitorList;
}

Я не знаю, является ли это самым элегантным решением, но мой код теперь работает нормально.

Visitor ToRecord(Document d) {
    var props = d.Properties;

    return new Visitor {
        Id = props["_id"].ToString(),
        FirstName = (string)props["first_name"],
        LastName = (string)props["last_name"],
        Occupation = (string)props["occupation"],
        Company = (string)props["company"],
        Email = (string)props["email"],
        Phone = (string)props["phone"],
        Birthday = (string)props["birthday"],
        LastVisit = (string)props["last_visit"],
        LocalImagePath = (string)props["local_image_path"],
        Type = (string)props["type"],
        CreatedAt = (string)props["created_at"],
        UpdatedAt = (string)props["updated_at"],
        DeletedAt = (string)props["deleted_at"]
    };
}

public List<Visitor> SearchRecord (string word)
{
    var viewByName = db.GetView ("ByName");

    viewByName.SetMap((doc, emit) => {
        if ((doc.ContainsKey("type") && doc["type"].ToString() == "visitor") && (doc.ContainsKey("deleted_at") && doc["deleted_at"] == null))
                emit (new [] {doc["first_name"], doc["last_name"]}, doc);
    }, "2");

    var visitorQuery = viewByName.CreateQuery();

    visitorQuery.StartKey = word;
    visitorQuery.Limit = 50;

    var rows = visitorQuery.Run();
    var visitorList = new List<Visitor> ();

    for (int i = 0; i < rows.Count (); i++) {
        var row = rows.GetRow (i);
        var name = row.Document.GetProperty ("first_name").ToString ().ToLower () + " " + row.Document.GetProperty ("last_name").ToString ().ToLower ();

        if (name.Contains (word))
            visitorList.Add(ToRecord(row.Document));
    }

    return visitorList;
}
Другие вопросы по тегам