【问题标题】:How does RavenDb "In" operator work?RavenDb "In" 运算符如何工作?
【发布时间】:2012-11-24 21:12:07
【问题描述】:

我可能不明白 RavenDb 中的“In”扩展方法是如何工作的。我认为它相当于 SQL 世界中的 IN 命令,例如WHERE 编号 (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) 时,它会中断并且最后两个查询不再返回结果。原始样本不起作用,因为正常 > 低。但我仍然想知道为什么会这样,因为这对我来说毫无意义。

【问题讨论】:

  • 您使用的是哪个版本的 RavenDb?
  • 我使用的是最新版本 2159。
  • 我已经测试了构建 960(稳定)和 2159、2160(不稳定)并且无法重现错误。对我来说,即使没有 WaitForNonStaleResults 选项,它也能正常工作。您是否激活了任何捆绑包或任何不寻常的设置?每次运行代码时都会发生这种情况还是偶尔会发生这种情况?
  • 每次都发生在我身上。没有捆绑包,没有特殊设置。
  • 另一种思路:1. 运行存储物品的代码; 2. 使用 RavenDb Management Studio 检查数据库中的文档 - 看看它们是否与您期望的一样; 3. 只运行查询以查看是否再次得到奇怪的结果。这应该可以避免任何过时的索引问题。

标签: c# linq lucene ravendb


【解决方案1】:

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

【讨论】:

  • 奇怪。我设置了 store.Conventions.DefaultQueryingConsistency = ConsistencyOptions.QueryYourWrites;以前,即使我添加 .Customize(a => a.WaitForNonStaleResults()) 它的行为也是一样的。
  • DefaultQueryingConsistency 功能对我也不起作用。我写了一个有帮助的扩展方法。请参阅 RavenDb:Force indexes to wait until not stale whilst unit testing
  • 对于所有未来的读者,请确保您不要在除单元测试之外的任何位置使用来自@biofractal 的解决方案。
猜你喜欢
  • 2011-01-05
  • 2012-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多