这失败了:
var results = container.Query<SomeClass>(s =>
s.Field == value && s.AnEnumField != SomeEnum.AnEnumValue
);
Assert.AreEqual(1, results.Count);
但这不会:
Predicate<SomeClass> matches = s =>
s.Field == value && s.AnEnumField != SomeEnum.AnEnumValue;
var results = container.Query<SomeClass>(s => matches(s));
Assert.AreEqual(1, results.Count);
测试中的不同清楚地表明问题仅在 db4o 进行表达式转换时发生,因为调用方法可以防止这种情况发生。测试中检查的值是精确值(没有大小写差异),因为测试首先插入它。
db4o 转换在这些查询中存在错误的任何特殊情况?也许与 .net 枚举?
我已经缩小了范围,我上面的例子没有包括麻烦的部分。与枚举字段无关,但与上述表达式中的“值”有关。
具体来说,当查询包含值的 someInstance.Field 时,会发生问题,例如:
var results =
container.Query<SomeClass>(s =>
s.Field == someInstance.Field && s.AnEnumField != SomeEnum.AnEnumValue
);
Assert.AreEqual(1, results.Count);