3

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

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

我在数据库中有 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() 过滤器会很好,但我可以理解为什么这不起作用。

4

2 回答 2

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;
        }
    }
}
于 2012-07-25T07:24:49.233 回答
0

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

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

这是执行的代码:

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

在此处输入图像描述

于 2014-12-17T18:25:00.640 回答