按新属性的RavenDB查询

按新属性的RavenDB查询,ravendb,Ravendb,我刚刚向现有的Foo类添加了一个新属性(已删除): public class Foo { // Other properties here public bool Deleted { get; set; } // New property } 我在数据库里有88个foo。当我尝试按此新属性进行查询时,没有得到任何文档: session.Query<Foo>().Where(x => x.Deleted == false); session.Query()。

我刚刚向现有的Foo类添加了一个新属性(已删除):

public class Foo
{
    // Other properties here
    public bool Deleted { get; set; }  // New property
}
我在数据库里有88个foo。当我尝试按此新属性进行查询时,没有得到任何文档:

session.Query<Foo>().Where(x => x.Deleted == false);
session.Query()。其中(x=>x.Deleted==false);
我相信这是因为数据库中的任何Foo文档上都不存在删除的属性。为了让它工作,我必须得到所有的foo,然后对完整列表进行筛选,并返回where Deleted==false

session.Query<Foo>();
return foos.Where(x => x.Deleted == false);
session.Query();
返回foos.Where(x=>x.Deleted==false);

这样的变化需要这样处理吗?在查询本身中使用Where()过滤器会很好,但我可以理解为什么这样做不起作用。

数据库中存储的实际文档中还不存在“已删除”属性,因此无法基于此属性进行查询

解决此问题的方法是首先将此属性添加到实际文档中。您只需加载所有文档,然后保存会话即可完成此操作

以下是如何实现该目标的示例代码:

public void LoadAndSave<T>()
{
    using (var session = store.OpenSession())
    {
        int skip = 0;
        const int take = 1024;
        while (true)
        {
            var builds = session.Query<T>()
                .Skip(skip)
                .Take(take)
                .ToList();
            skip += builds.Count;

            session.SaveChanges();

            if (builds.Count == 0)
                break;
        }
    }
}
public void LoadAndSave()
{
使用(var session=store.OpenSession())
{
int skip=0;
const int take=1024;
while(true)
{
var builds=session.Query()
.Skip(Skip)
.拿(拿)
.ToList();
跳过+=构建。计数;
session.SaveChanges();
如果(builds.Count==0)
打破
}
}
}

我想我应该发布另一个简单易行的选项

在Raven Studio中,您可以在“修补程序”选项卡上执行修补程序。您可以对集合进行修补,以便该属性现在存在于每个文档中。只需将属性设置为自身相等即可。如果该属性已经存在,则只将其设置为自身。如果属性不存在,它将被添加为null。现有信息仍然存在;没有信息丢失

这是执行的代码:

this.ApplicationWithOverrideVariableGroup.CustomVariableGroupIds = this.ApplicationWithOverrideVariableGroup.CustomVariableGroupIds;

所以我需要编写这段一次性代码,并让它只执行一次。(我只是想到了许多安装的部署场景。)这个答案似乎证实了我的假设,即在所有文档都与新字段一起保存之前,查询新字段是不可能的。谢谢