C# 在LiteDB中避免全表扫描?

C# 在LiteDB中避免全表扫描?,c#,litedb,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 =

见代码:

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行=新列表(){
新PosLine{Name=“John”,Address=“dummy1”,Tstamp=DateTime.Now},
新PosLine{Name=“Jane”,Address=“dummy2”,Tstamp=DateTime.Now}
};
使用(var db=new LiteDatabase(@“test.db”))
{
var posLines=db.GetCollection(“POS”);
foreach(行中的var行)
{
var id=posLines.Insert(行);
Console.WriteLine(“id=“+id.ToString());
}
var Name=posLines.FindAll().Select(p=>p.Name.ToList();
foreach(名称中的变量名称)
{
Console.WriteLine(“name=“+name”);
}
}

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

如果您正在读取所有文档,您将永远无法避免全表扫描。使用
Name
中的索引可以进行完整的索引扫描(避免完整的“表”扫描)。这两种完全扫描的区别在于反序列化时间和读取的数据量(索引完全扫描要便宜得多)


不幸的是,在当前版本的LiteDB中,您没有选项只能获取索引键。实现这一点很容易,所以在github上打开一个可以在下一版本中实现的问题。

如果您正在阅读所有文档,您将永远无法避免完全扫描。使用
Name
中的索引可以进行完整的索引扫描(避免完整的“表”扫描)。这两种完全扫描的区别在于反序列化时间和读取的数据量(索引完全扫描要便宜得多)


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

这正是我想要的。此处打开的问题:。谢谢这正是我想要的。此处打开的问题:。谢谢