新属性的RavenDB查询

时间:2012-07-24 15:43:28

标签: ravendb

我刚刚在现有的Foo类中添加了一个新属性(Deleted):

public class Foo
{
    // Other properties here
    public bool Deleted { get; set; }  // New property
}

我在DB中有88个Foos。当我尝试通过这个新属性进行查询时,我没有得到任何文档:

session.Query<Foo>().Where(x => x.Deleted == false);

我认为这是因为数据库中的任何Foo文档都不存在Deleted属性。为了使这个工作,我必须得到所有Foos,然后过滤完整列表并返回Deleted == false。

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

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

2 个答案:

答案 0 :(得分:2)

已删除的属性在存储在数据库中的实际文档中尚不存在,因此这就是您无法根据此属性查询它们的原因。

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

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

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;
        }
    }
}

答案 1 :(得分:0)

我以为我会发布另一个简单易行的选项。

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

这是执行的代码:

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

enter image description here