避免在LiteDB中进行全表扫描?

时间:2016-08-11 01:54:19

标签: c# litedb

参见代码:

var lines = new List<PosLine>(){
    new PosLine{Name="John", Address="dummy1", Tstamp=DateTime.Now},
    new PosLine{Name="Jane", Address="dummy2", Tstamp=DateTime.Now}
};

using(var db = new LiteDatabase(@"test.db"))
{
    var posLines = db.GetCollection<PosLine>("POS");
    foreach(var line in lines)
    {
        var id = posLines.Insert(line);
        Console.WriteLine("id=" + id.ToString());
    }

    var names = posLines.FindAll().Select(p => p.Name).ToList();
    foreach(var name in names)
    {
        Console.WriteLine("name=" + name);
    }
}

var names = posLines.FindAll().Select(p => p.Name).ToList();尝试获取“名称”列表,但在这种情况下,它是一个全表扫描。有没有办法避免全表扫描,比如我在“Name”属性上创建索引,然后从该索引中获取所有名称?

1 个答案:

答案 0 :(得分:0)

如果您正在阅读所有文档,则永远不会避免完全扫描。使用Name中的索引,您可以执行完整的索引扫描(避免完整的“表”扫描)。这两次完整扫描之间的差异是反序列化时间和数据读取量(索引全扫描要便宜得多)。

不幸的是,在LiteDB的当前版本中,您无法仅获取索引键。这很容易实现,所以在github上打开一个可以在下一个版本中实现的问题。