2014-01-09 20 views
3

我有我自己的小數據庫(用於學習目的)。數據以二進制形式存儲在磁盤上。 我可以做一個全表掃描,我的數據庫將每個「行」作爲一個byte [] row_buffer返回。 row_buffer包含每一行的字段。從邏輯上講,它看起來像:對我自己的類型在byte []上實現Linq查詢

row_buffer = [[var_string][int32][var_string]]

我有一個「表定義」結構定義的列。點是,我知道每一行中每個數據字段的位置。

現在,我想要實現的LINQ能力,從我的數據庫中查詢數據(簡單的查詢):

var DemoTable = new Table<PeopleClass>(); 
var result = DemoTable.Where(p => p.Name == "Peter").Select(p => p).ToList(); 

在我的表類,我已經實現以下邏輯:

public IEnumerable<T> Where(Func<T, bool> predicate) 
{ 
    foreach (var item in this.rows) 
    { 
    if (predicate(item)) yield return item; 
    } 
} 

注:this.rows是一個包含數據庫所有記錄的List。

我的問題是,爲每行生成PeopleClass對象效率非常低(由於將字節[]轉換爲字符串)。我想盡可能推遲創作。

目前,我正在研究將條件轉換爲byte [],並直接對我的行進行比較。但我迄今失敗了。

如何實現IEnumerable<T> Where(Func<T, bool> predicate)直接在row_buffer上運行,而不是首先生成PeopleClass對象?只有成功的點擊才能轉換爲PeopleClass對象。

我沒有找到一種方法來提取謂詞中的條件(字段名稱,例如「Name」和該字段的哪個值是必需的)。

任何幫助將不勝感激。

+0

您可能必須將謂詞解析爲表達式才能高效。 EF做到這一點,也許你可以看看他們的源代碼。 – TGlatzer

回答

2

首先,它看起來像你需要創建一個LINQ提供程序,你不需要實現Where等,這已經完成。在開始考慮任何可能的性能問題之前,我會先從那裏開始。

你需要創建一個自定義提供程序來執行表達式樹等,這是相當複雜的解碼的特定邏輯的IQueryable,有一個看看MSDN: Walkthrough: Creating an IQueryable LINQ ProviderWriting custom LINQ provider ,有很多的教程左右。

編輯:刪除白癡的改善。

+1

「var result = DemoTable.Select(p => p.Name ==」Peter「)。ToList();」這沒有意義?你會有一個布爾值列表... – Moeri