Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “RavenDb是怎么做的?”;在;操作员工作?_C#_Linq_Lucene_Ravendb - Fatal编程技术网

C# “RavenDb是怎么做的?”;在;操作员工作?

C# “RavenDb是怎么做的?”;在;操作员工作?,c#,linq,lucene,ravendb,C#,Linq,Lucene,Ravendb,我可能不明白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", Sev

我可能不明白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));
}
//我有3条记录-两条严重性正常,一条严重性较低
使用(var session=store.OpenSession())
{
session.Store(新TestObject{Name=“o1”,Severity=Severity.Normal});
session.Store(新TestObject{Name=“o2”,Severity=Severity.Low});
session.Store(新TestObject{Name=“o3”,Severity=Severity.Normal});
session.SaveChanges();
}
//这将写入低严重性记录,似乎是正确的
使用(var session=store.OpenSession())
{
var data=session.Query()
.Where(o=>o.Severity.In(新[]{Severity.Low}))
.OrderBy(o=>o.Name).ToList();
data.ForEach(r=>Console.WriteLine(r));
}
//这也写入了低严重性记录,似乎仍然正确
使用(var session=store.OpenSession())
{
var data=session.Query()
.Where(o=>o.Severity.In(新[]{Severity.Low,Severity.High}))
.OrderBy(o=>o.Name).ToList();
data.ForEach(r=>Console.WriteLine(r));
}
//这写了所有的记录,似乎仍然正确
使用(var session=store.OpenSession())
{
var data=session.Query()
.其中(o=>o.Severity.In(
新[]{Severity.High,Severity.Low,Severity.Normal})
.OrderBy(o=>o.Name).ToList();
data.ForEach(r=>Console.WriteLine(r));
}
//但这并没有写任何东西
//尽管有2份严重程度正常的记录
使用(var session=store.OpenSession())
{
var data=session.Query()
.Where(o=>o.Severity.In(新[]{Severity.High,Severity.Normal}))
.OrderBy(o=>o.Name).ToList();
data.ForEach(r=>Console.WriteLine(r));
}
//这也没有写任何东西,
//我只是尝试了数组中值的顺序是否重要
使用(var session=store.OpenSession())
{
var data=session.Query()
.Where(o=>o.Severity.In(新[]{Severity.Normal,Severity.High}))
.OrderBy(o=>o.Name).ToList();
data.ForEach(r=>Console.WriteLine(r));
}
还是我在RavenDb/Lucene引擎中发现了一个bug

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

您正在运行过时的索引,这就是为什么会得到奇怪的结果。
您需要先等待索引完成。

您使用的是什么版本的RavenDb?我使用最新的版本2159。我已使用版本960(稳定)和21592160(不稳定)进行了测试,无法再现错误。对我来说,即使没有
WaitForNonStaleResults
选项,它也可以正常工作。您是否有激活的捆绑包或任何异常设置?这是每次运行代码时发生的还是偶尔发生的?每次都发生在我身上。没有捆绑,没有特殊设置。另一个想法:1。运行存储项目的代码;2.使用RavenDb Management Studio检查数据库中的文档-查看它们是否与您期望的一样;3.运行查询只是为了查看是否再次得到奇怪的结果。这将避免任何陈旧的索引问题。奇怪。我已经设置了store.Conventions.DefaultQueryingConsistency=ConsistencyOptions.QueryYourWrites;以前,即使我添加了.Customize(a=>a.WaitForNonSaleResults()),它的行为也是一样的。
DefaultQueryingConsistency
功能对我也不起作用。我已经编写了一个扩展方法来帮助您。请参阅RavenDb:对于所有未来的读者,请确保在单元测试之外的任何位置都不要使用@biofractal提供的解决方案。