【问题标题】:How i can add Couchbase Documents in a list?我如何在列表中添加 Couchbase 文档?
【发布时间】:2015-04-10 05:44:35
【问题描述】:

我正在尝试使用 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)

提前感谢您提供的任何帮助。

【问题讨论】:

    标签: c# .net xamarin couchbase couchbase-lite


    【解决方案1】:

    您的映射部分有问题。您可以直接在 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;
    }
    

    【讨论】:

    • 它给我一个错误:错误 CS0308:非泛型方法 `Couchbase.Lite.Database.GetView(string)' 不能与类型参数一起使用 (CS0308) (Demo_Couchbase.Droid)
    • @JonathanZúñiga, var viewByName = db.GetView("ByName","ByName");你需要传递两个参数
    • 嗨,有两个参数它给了我这个错误:方法GetView' takes 2'参数没有重载(CS1501)。谢谢 Sudharshan,但我已经解决了我的问题,我会发布我所做的。
    【解决方案2】:

    我不知道这是否是最优雅的解决方案,但我的代码现在可以正常工作了。

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

    【讨论】:

    • 欢迎来到 StackOverflow!发布答案时,请不仅仅包含代码 sn-p - 确定解决方案是什么,以便其他人也可以从您的解决方案中受益。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    相关资源
    最近更新 更多