快速可查询的对象集合

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 个字段时,使用字典嵌套字典开始变得复杂。

是否已经存在类似于此的库?


数据库怎么样?SQLite或SQL Server Express会让人想起。 - lc.
如下所述,我想将所有内容保存在内存中。我知道SQLite确实有一个内存模块,但对于我要做的事情来说,它感觉太重了。 - ckoo
相信不是来自微软的.NET。.NET并不试图成为一个数据库(我也不希望它成为)。对于集合,键被哈希处理就可以了。DataTable可以有多个键,但与.NET 4.0+集合相比,DataTable速度较慢。有多少个?LINQ到List非常快。 - paparazzo
你是在谈论内存中的数据还是持久化到磁盘上的数据? - Enigmativity
这个CodePlex项目似乎可以满足这个需求:https://indexedlist.codeplex.com/ - ckoo
4个回答

2

那么什么是面向对象数据库呢?

Sterling是一个不错的选择。它支持LINQ to Object,所以无需担心查询问题。我们已经在一些中等规模的项目中使用它,并取得了良好的结果(速度相当快)。


谢谢提供这些链接。我正在寻找一些非常轻量级的东西,可以将所有信息保存在内存中(即我不需要持久化数据)。Sterling看起来很有前途,我会进一步调查。 - ckoo
看了看Sterling,你必须从一个基类中继承以便将对象存储到数据库中,这是个硬性规定。还有一些类似的库,比如NDatabase,不需要基类。虽然它在表达方面没有我最初想要的那么灵活,但作为持久化OOD,我一直在测试它并且非常满意。 - ckoo

1
你也应该看看RaptorDB。包括全嵌入式版本在内的几个版本可以在CodeProject 这里找到。

0

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

SortedDictionary<property, List<MyClass>>

然后解析Linq表达式树以查找正在查询的属性。我们可以检索sortedDictionaries的有效键,然后通过这些键循环遍历每个排序字典的列表,然后使用Set操作,例如Union()和Intersect(),具体取决于表达式树是否具有OR或AND指令。 然后返回与搜索条件匹配的列表。

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

有关此方法的任何想法?


这个CodePlex项目似乎可以满足您的需求:https://indexedlist.codeplex.com/ - ckoo

0
你可以使用Lucene.NET,它也可以完全运行在内存中(虽然我不确定这是否符合你的要求)。它支持基于字段条件对文档进行闪电般快速的检索。
所以实际上这就给了你一个文档数据库。如果你再进一步,你就会得到像RavenDB(商业)这样的东西。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接