6

背景

我正在一个名为eselinq的谷歌代码项目中为 ESE 到 .NET 和 LINQ 编写一个适配器。我似乎无法弄清楚的一个重要功能是如何获取为表定义的索引列表。我需要能够列出可用索引,以便 LINQ 部分可以自动确定何时可以使用索引。如果可以找到适当的索引,这将为用户查询提供更有效的计划。

查询索引信息有两个相关函数:

这些仅在如何指定相关表(名称或tableid)方面有所不同。听起来这些将支持我想要的功能,但所有信息级别似乎都要求我已经有一个特定的索引来查询信息。唯一的例外是JET_IdxInfoCount,但这仅计算存在多少索引。

JET_IdxInfo听起来很合理,JET_INDEXLIST但它只列出特定索引上的列。

备择方案

我知道我可以通过另一种方式获取索引信息,例如与数据库表对应的 .NET 类型上的注释,或者要求提前提供索引映射。我认为已经实现了足够的内省,以使其他所有东西都可以在没有用户提供额外信息的情况下开箱即用,除了这个功能。

另一种选择可能是检查系统表以查找相关的索引对象,但这意味着取决于未记录的接口。

为了满足这个问题,我需要一种支持的方法来枚举表上的索引(只需名称就足够了)。

4

1 回答 1

6

您对 JetGetTableIndexInfo 和 JetGetIndexInfo 和 JET_IdxInfo 是正确的。不同之处在于返回的数据有点复杂:返回一个临时表,其中包含一行作为索引,然后是表中每一列的一行。要仅获取索引名称,您需要跳过列行(列数由第一行中 columnidcColumn 列的值给出)。

有关如何破译此内容的 .NET 示例,请查看ManagedEsent项目。在 MetaDataHelpers.cs 文件中有一个名为 GetIndexInfoFromIndexlist 的方法,它从临时表中提取所有数据。

于 2010-02-27T00:42:38.533 回答