多列索引搜索Microsoft.Isam.Esent

时间:2016-11-10 08:27:28

标签: c# esent

我遇到以下问题:我在数据库index1 {binaryColumn1,binaryColumn2}上有一个复合索引。我使用以下设置索引:

Api.JetSetCurrentIndex(_session, _table, index1);

创建密钥:

Api.MakeKey(_session, _table, binaryValue, MakeKeyGrbit.NewKey);

并尝试使用以下方式执行搜索:

Api.TrySeek(_session, _table, SeekGrbit.SeekEQ);

如果index1仅用于1列,则此方法可正常返回true。如果我有多列并尝试搜索单个列的值(例如,对于binaryColumn1 = {0x01,0x23}),它总是返回false。

如何搜索这一个值? (ps。我无法更改索引,也无法创建新索引。)这可能吗?

谢谢

1 个答案:

答案 0 :(得分:1)

您所做的只适用于{0x01, 0x00}。您无法通过一次通话完成此操作,因为第二列的值会混淆SeekEQ grbit。

您可以执行SeekGE,但是您需要检索列以确保该值实际上是正确的(而不是{0x22, 0x23})。你必须做以下事情: SetCurrentIndex() MakeKey( ..., binaryValue1, MakeKeyGrbit.NewKey | MakeKeyGrbit.FullColumnStartLimit); // Appends the rest of the search buffer with 0x00's. Seek(GE); MakeKey(... binaryValue1, MakeKeyGrbit.NewKey | MakeKeyGrbit.FullColumnEndLimit); // Appends the rest of the search buffer with 0xff's. Api.JetSetIndexRange(); 然后,您可以使用Api.TryMoveNext()来迭代该列等于binaryValue1的所有行。

另请查看项目中包含的测试代码 - HowDoI.cs文件有很多很好的例子。

抱歉伪代码;我目前还没有方便的源代码。

-Martin

相关问题