2012-09-25 78 views
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個字段時,使用詞典的詞典開始變得複雜。

是否有一個庫已經存在,做這樣的事情?

+0

數據庫如何? SQLite或SQL Server Express浮現在腦海 –

+0

如下所述,我想將所有內容都保存在內存中。我知道SQLite確實有一個內存模塊,但它只是對我正在嘗試做的事情感到重量級。 – ckoo

+0

很確定不是來自Microsoft的.NET。 .NET不會嘗試做一個數據庫(我不希望它是)。對於集合,密鑰是散列的,就是關於它的。 DataTable可以有多個鍵,但與.NET 4.0+集合相比,DataTable速度較慢。多少? LINQ to List非常快。 – Paparazzi

回答

2

怎麼樣object oriented database

Sterling是一個推薦的選項。它支持LINQ to Object,所以不用擔心查詢,我們已經將它用於幾個結果良好的中型項目(速度非常快)。

+0

感謝您的鏈接。我正在尋找一種非常輕量級的東西來保存所有的信息。 (即我不需要堅持數據)。斯特林看起來很有希望。將進一步調查。 – ckoo

+0

看看Sterling,您必須從基類繼承才能將對象存儲在數據庫中,這是一個交易斷路器。同樣的東西是[NDatabase](http://ndatabase.codeplex.com/),它不需要基類。它不像我最初想要的那樣敏捷,表達明智,但是我一直在測試它作爲一個持久的OOD,並且對它非常滿意。 – ckoo

0

你可以使用Lucene.NET,它也可以在內存中完全運行(儘管我不確定這是你想要的)。它支持根據現場標準快速檢索文檔。

因此,這實際上給你一個文件數據庫。如果你更進一步,最終會得到像RavenDB(商業版)的東西。

0

我想知道我們是否可以通過爲每個索引屬性創建SortedDictionary來實現此目的。

SortedDictionary<property, List<MyClass>> 

然後解析Linq表達式樹來找出哪些屬性被查詢。我們可以檢索sortedDictionaries的有效密鑰,然後遍歷這些密鑰以獲取每個已排序字典的List,然後使用Set操作(如Union()和Intersect(),具體取決於表達式樹是否具有OR或AND指令。 然後返回符合搜索條件的列表。

如果查詢包含未編制索引的屬性,請首先使用索引屬性執行查詢,然後使用普通Linq將其關閉。

有趣的位然後變成解析表達式樹。

對此方法有何想法?

+0

這個codeplex項目似乎解決了這個需求:https://indexedlist.codeplex.com/ – ckoo

1

你應該看看RaptorDB。在CodeProject here上可以找到幾個版本,包括完全嵌入版本。