3

我正在寻找一个可以接受对象集合并返回索引数据结构的库,该结构将针对快速查询进行优化。

这可能通过一个例子更好地说明:

public class MyClass
{
    public sting Name {get;set;}
    public double Number {get;set;}
    public ... (Many more fields)
}     


var dataStore = Indexer.Parse(myClassCollection).Index(x => x.Name).Index(x => x.Number).Index( x => x.SomeOtherProperty);
var queryResult = dataStore.Where( x => x.Name == "ABC").Where(x => x.Number == 23).Where( x => x.SomeOtherProperty == dateTimeValue);

这个想法是查询dataStore将非常快,大约为O(log n).

当您有超过 2 或 3 个要索引的字段时,使用字典的字典开始变得复杂。

是否有一个已经存在的库可以做这样的事情?

4

4 回答 4

2

面向对象的数据库怎么样。

英镑是推荐的选择。它支持 LINQ to Object,所以不用担心查询,我们已经在几个中等项目中使用了它,结果很好(它非常快)。

于 2012-09-25T01:18:38.707 回答
1

你也应该看看 RaptorDB。可以在此处的 CodeProject 上找到多个版本,包括完全嵌入式版本。

于 2012-10-03T17:25:42.160 回答
0

您可以使用 Lucene.NET,它也可以完全在内存中运行(尽管我不确定这是否是您想要的)。它支持基于字段标准的快速文档检索。

因此,这实际上为您提供了一个文档数据库。如果你更进一步,你最终会得到像 RavenDB(商业)这样的东西。

于 2012-09-25T01:24:40.267 回答
0

我想知道我们是否可以通过为每个索引属性创建一个 SortedDictionary 来实现这一点。

SortedDictionary<property, List<MyClass>>

然后解析 Linq 表达式树,找出正在查询的属性。我们可以检索 sortedDictionaries 的有效键,然后遍历这些键以获取每个已排序字典的 List,然后根据表达式树是否具有 OR 或 AND 指令使用诸如 Union() 和 Intersect() 之类的 Set 操作。然后返回匹配搜索条件的列表。

如果查询包含未索引的属性,请先使用索引属性执行查询,然后使用普通 Linq 完成它。

然后有趣的部分变成了解析表达式树。

对这种方法有什么想法吗?

于 2012-09-26T00:54:48.837 回答