我有我自己的小數據庫(用於學習目的)。數據以二進制形式存儲在磁盤上。 我可以做一個全表掃描,我的數據庫將每個「行」作爲一個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」和該字段的哪個值是必需的)。
任何幫助將不勝感激。
您可能必須將謂詞解析爲表達式才能高效。 EF做到這一點,也許你可以看看他們的源代碼。 – TGlatzer