5

以下は単純なクラスです。

public class Person
{
    public int Id {get; set;}
    public string Name {get; set;}
}

これを RavenDB に保存すると、ID が割り当てられます。たとえば、それが 1 であるとします。

var person = session.Load<Person>("Person/1")

私が指定した人を返しますが、これは

var person = session.Query<Person>().First(p => p.Id == 1)

エラーが発生し、「シーケンスに要素が含まれていません」と表示されます。理由がわかりません。

4

1 に答える 1

11

IDによるドキュメントのロードはACID操作です。つまり、ドキュメントを保存した瞬間に、ドキュメントを取得できるようになります。

一方、ドキュメントのクエリは、「結果整合性」というSQLなしの概念に従います。インデックスをクエリしていますが、そのインデックスを完全に構築する時間があった場合とない場合があります。

あなたの例では、インデックスはまだ古くなっています。十分に長く待つと、クエリは正しく返されます。または、WaitForNonStaleResultsのカスタマイズを使用して、Ravenに待機するように指示することもできますが、これは危険な副作用をもたらす可能性があります(特にビジーなインデックスの場合)。古いインデックスクエリの詳細については、http://ravendb.net/docs/client-api/querying/stale-indexesをご覧ください。

一般に、ドキュメントのIDがわかっている場合は、常に.Load()を使用する必要があります。実際にインデックスルックアップを必要とするもののために.Query()を使用して予約します。あなたの場合、妥当なクエリは次のようになります。

var person = session.Query<Person>().Where(p => p.Name == "Joe").FirstOrDefault();
于 2012-08-08T15:14:02.593 に答える