3

既存のFooクラスに新しいプロパティ(削除済み)を追加しました。

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

DBに88Foosがあります。この新しいプロパティでクエリを実行しようとすると、ドキュメントが表示されません。

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

これは、DeletedプロパティがDB内のどのFooドキュメントにも存在しないためだと思います。これを機能させるには、すべての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 では、[パッチ] タブでパッチを実行できます。プロパティがすべてのドキュメントに存在するように、コレクションにパッチを適用できます。プロパティをそれ自体と等しく設定するだけです。プロパティが既に存在する場合は、それ自体に設定されます。プロパティが存在しない場合は、null として追加されます。既存の情報は残ります。情報が失われることはありません。

これは実行されたコードです:

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

ここに画像の説明を入力

于 2014-12-17T18:25:00.640 に答える