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);
}
}
}
在这种情况下,您将只需要订购过滤后的文档。
我是 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);
}
}
}
在这种情况下,您将只需要订购过滤后的文档。