C# 中的 LiteDB 多个查询

LiteDB multiple queries in C#

我是 LiteDB 的新手,想一次执行两个或多个查询。

我希望能够在我的数据库中搜索某个客户,并且由于会有多个具有相似名称的客户,我想要 return 所有这些客户并将它们按 降序排列(ID 或日期)订单。我有两个功能即兴但分开,所以我正在寻找一种方法来 将搜索和排序 组合成 一个查询 .

这里是主要的搜索功能:

private void search_btn_Click(object sender, RoutedEventArgs e)
    {
        using (var dataBase = new LiteDatabase(dbConnectionString))
        {
            // Stranka = Customer
            var collection = dataBase.GetCollection<Stranka>("stranka");
            // Search for a customer name whom I enter in the searchName_tb
            var query = collection.Find(Query.Where("Ime_Priimek", 
            x => x.AsString.Contains(searchName_tb.Text)));

            // Currently I'm doing everything with ListView, so I clear it
            // to make room for resulting data to be shown
            lvStranke.Items.Clear();

            foreach (var customer in query)
            {                 
                lvStranke.Items.Add(customer);
            }
        }
    }

这是我的降序排序版本,当他们得到 loaded/refreshed:

    public void LiteDB_ShowAll()
    {
        using (var dataBase = new LiteDatabase(dbConnectionString))
        {
            var collection = dataBase.GetCollection<Stranka>("stranka");
            lvStranke.Items.Clear();

            var count = collection.Count(Query.All());
            // From last ID to first (Descending)
            for (int i = count; i >= 1; i--)
            {
                lvStranke.Items.Add(collection.FindById(i));
            }               
        }         
    }

您看过 Queries wiki page 中的示例了吗?看起来您可以使用 LINQ 对通过 Find 获得的对象进行排序,尽管这将在客户端而不是引擎本身完成。

    public void LiteDB_ShowAll()
    {
        using (var dataBase = new LiteDatabase(dbConnectionString))
        {
            var collection = dataBase.GetCollection<Stranka>("stranka");
            lvStranke.Items.Clear();

            foreach(var cust in collection.FindAll().OrderByDescending(x => x.Date)) // or by x.Id
            {
                lvStranke.Items.Add(cust);
            }               
        }         
    }

您的 LiteDB_ShowAll 实施的重要缺点不是效率低下。事实上,它期望 Customer 对象永远不会从数据库中删除,而这通常是不正确的。所以你最终会在你的 ID 中有 "gaps",这会破坏你的代码。

最好的搜索方式是在查询字段中使用索引并对结果进行排序,如下所示:

public void LiteDB_ShowAll()
{
    using (var dataBase = new LiteDatabase(dbConnectionString))
    {
        var collection = dataBase.GetCollection<Stranka>("stranka");
        collection.EnsureIndex("Ime_Priimek");

        lvStranke.Items.Clear();

        var result = collection
            .Find(Query.StartsWith("Ime_Priimek", searchName_tb.Text))
            .OrderBy(x => x["_id"].AsInt32);

        foreach (var item in result)
        {
            lvStranke.Items.Add(item);
        }               
    }         
}

在这种情况下,您将只需要订购过滤后的文档。