繁体   English   中英

RavenDb“输入”操作员如何工作?

[英]How does RavenDb “In” operator work?

我可能不了解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引擎中发现错误?

编辑

我发现了另一件事。 它必须与枚举成员的字母顺序有关。 当我将Severity.Normal重命名为Severity.A时,最后两个查询的行为正确并返回结果。 当我将Severity.Normal重命名为Severity.La时,它仍然有效(因为La <Low)。 但是,当我将Severity.Normal重命名为Severity.Lu(Lu> Low)时,它中断了,最后两个查询不再返回结果。 原始样本不起作用,因为“正常”>“低”。 但是我仍然想知道为什么会发生,因为这对我来说毫无意义。

您遇到了过时的索引,这就是为什么您会得到奇怪的结果的原因。 您需要等待索引首先完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM