我正在处理自己的小数据库(用于学习目的)。数据以二进制形式存储在磁盘上。 我可以进行全表扫描,我的数据库将每个“行”作为byte [] row_buffer返回。 row_buffer包含每行的字段。从逻辑上讲,它看起来像:
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();
在我的Table类中,我实现了以下逻辑:
public IEnumerable<T> Where(Func<T, bool> predicate)
{
foreach (var item in this.rows)
{
if (predicate(item)) yield return item;
}
}
注意:this.rows是一个包含数据库所有记录的List。
我的问题是为每一行生成PeopleClass对象的效率非常低(因为将bytes []转换为string)。我想尽可能地推迟创作。
目前,我正在研究将条件转换为byte []并将其直接与我的行进行比较。但到目前为止我失败了。
如何实现IEnumerable<T> Where(Func<T, bool> predicate)
直接操作row_buffer而不必先生成PeopleClass对象?只有成功的匹配才能转换为PeopleClass对象。
我没有找到在谓词中提取条件的方法(哪个字段名称例如“Name”以及该字段的值是必需的)。
任何帮助都将受到高度赞赏。
答案 0 :(得分:2)
首先,看起来你需要创建一个LINQ提供程序,你不需要实现已经完成的Where
等。在查看任何可能的性能问题之前,我会从那里开始。
您需要使用自定义提供程序创建IQueryable
以执行解码表达式树等的特定逻辑。这非常复杂,请查看MSDN: Walkthrough: Creating an IQueryable LINQ Provider或Writing custom LINQ provider
,有很多教程。
编辑:删除了白痴改进。