在byte []上实现我自己类型的Linq查询

时间:2014-01-09 09:31:18

标签: c# .net database performance linq

我正在处理自己的小数据库(用于学习目的)。数据以二进制形式存储在磁盘上。 我可以进行全表扫描,我的数据库将每个“行”作为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”以及该字段的值是必需的)。

任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:2)

首先,看起来你需要创建一个LINQ提供程序,你不需要实现已经完成的Where等。在查看任何可能的性能问题之前,我会从那里开始。

您需要使用自定义提供程序创建IQueryable以执行解码表达式树等的特定逻辑。这非常复杂,请查看MSDN: Walkthrough: Creating an IQueryable LINQ ProviderWriting custom LINQ provider ,有很多教程。

编辑:删除了白痴改进。