RavenDb の "In" 拡張メソッドがどのように機能するのか、おそらく理解できません。SQL の世界の IN コマンド、例えば WHERE Number IN (1, 2, 3) に相当すると思いました。しかし、それはかなり奇妙な振る舞いをします。
// i have 3 records - two with Normal severity, one with Low severity
using (var session = store.OpenSession())
{
session.Store(new TestObject { Name = "o1", Severity = Severity.Normal });
session.Store(new TestObject { Name = "o2", Severity = Severity.Low });
session.Store(new TestObject { Name = "o3", Severity = Severity.Normal });
session.SaveChanges();
}
// this writes the Low severity record, it seems correct
using (var session = store.OpenSession())
{
var data = session.Query<TestObject>()
.Where(o => o.Severity.In(new[] { Severity.Low }))
.OrderBy(o => o.Name).ToList();
data.ForEach(r => Console.WriteLine(r));
}
// this writes also the Low severity record, it still seems correct
using (var session = store.OpenSession())
{
var data = session.Query<TestObject>()
.Where(o => o.Severity.In(new[] { Severity.Low, Severity.High }))
.OrderBy(o => o.Name).ToList();
data.ForEach(r => Console.WriteLine(r));
}
// this writes all records, still seems correct
using (var session = store.OpenSession())
{
var data = session.Query<TestObject>()
.Where(o => o.Severity.In(
new[] { Severity.High, Severity.Low, Severity.Normal }))
.OrderBy(o => o.Name).ToList();
data.ForEach(r => Console.WriteLine(r));
}
// but this does not write anything
// despite there are 2 records with Normal severity
using (var session = store.OpenSession())
{
var data = session.Query<TestObject>()
.Where(o => o.Severity.In(new[] { Severity.High, Severity.Normal }))
.OrderBy(o => o.Name).ToList();
data.ForEach(r => Console.WriteLine(r));
}
// and this does not write anything either,
// I just tried whether the order of values in the array matters
using (var session = store.OpenSession())
{
var data = session.Query<TestObject>()
.Where(o => o.Severity.In(new[] { Severity.Normal, Severity.High }))
.OrderBy(o => o.Name).ToList();
data.ForEach(r => Console.WriteLine(r));
}
または、RavenDb/Lucene エンジンでバグを見つけましたか?
編集
私は別の奇妙なものを見つけました。enumメンバーのアルファベット順で何かをしなければなりません。Severity.Normal の名前を Severity.A に変更すると、最後の 2 つのクエリは正しく動作し、結果が返されます。Severity.Normal の名前を Severity.La に変更しても、引き続き機能します (La < Low のため)。しかし、Severity.Normal の名前を Severity.Lu (Lu > Low) に変更すると、名前が壊れて、最後の 2 つのクエリが結果を返さなくなります。通常 > 低のため、元のサンプルは機能しません。しかし、私には意味が分からないので、なぜそれが起こるのか疑問に思っています.