2016-11-10 77 views
3

我面临以下问题:我有一个数据库索引1 {binaryColumn1,binaryColumn2}上的组合索引。我使用以下设置要使用的索引:多列索引搜索Microsoft.Isam.Esent

Api.JetSetCurrentIndex(_session, _table, index1); 

创建密钥:

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

,比尝试与执行搜索:

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

这工作和如果index1仅适用于1列,seek将正确返回true。如果我有多个列并尝试搜索单列的值(例如,binaryColumn1 = {0x01,0x23}),它总是返回false。

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

谢谢

回答

1

你做了什么会只为{0x01, 0x00}工作。您无法通过一次通话来完成此操作,因为第二列的值将会混合格子位SeekEQ

您可以做一个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