3

Raven DB から奇妙な (非) 結果が得られます。

クライアントとサーバーの両方で、最新の安定ビルド v2.5.2666 を実行しています。

取得したいのは、「Id 値が 'x' である Component オブジェクトを含む最初の DeployProject ドキュメント」です。

だから私が最初に試したのは:

var project = _documentSession.Query<DeployProject>()
      .FirstOrDefault(i=>i.ComponentList.Any(j=>j.Id == componentId));

しかし、データが正しいことはわかっていても、null が返されました。私が狂っていないことを確認するために、中央に .ToList() を追加しました。これにより、すべてのドキュメントがメモリクエリに取り出されます。

var project = _documentSession.Query<DeployProject>()
      .ToList()
      .FirstOrDefault(i=>i.ComponentList.Any(j=>j.Id == componentId));

そして、その DID は機能するので、私のロジックとデータは正しいです。しかし、もちろん、それは本当に非効率的です。全体的な考え方は、関連する子レコードを含む単一のドキュメントだけを取得したいということです。

したがって、Raven がインデックスをクエリする方法に問題があるようです。データは間違いなくそこにあり、すべてをメモリにプルして同じ LINQ クエリを実行すると、データを取得できます。

私の希望 (恐れ?) は、インデックスが古くなっていることでした。そのため、新しいデータを提供するように指示しました。

var project = _documentSession.Query<DeployProject>()
      .Customize(i=>i.WaitForNonStaleResultsAsOfLastWrite())
      .FirstOrDefault(i=>i.ComponentList.Any(j=>j.Id == componentId));

しかし、再びヌルになりました。Raven は、LINQ ステートメントを私が期待する方法、つまり LINQ to objects が機能する方法で扱っていないようです。いくつかの違いがあることはわかっていますが、これは非常に単純なクエリであり、うまくいくはずです。

誰にもアイデアはありますか?簡単なものがありませんか?

編集:レイヴンのドキュメントによると、これは冒険的なインデックス作成なしで機能するようです:

http://ravendb.net/docs/client-api/querying/using-linq-to-query-ravendb

Where 句以外にも、結果をフィルター処理するために使用できる便利な演算子がいくつかあります。

エンティティ内のオブジェクトのコレクション (またはプリミティブ リスト) で Any を使用して、条件を満たすものだけを返すことができます。RavenDB は In 演算子もサポートしており、Any の逆比較をより簡単に行うことができます。

// Return only companies having at least one employee named "Ayende"
IQueryable<Company> companies = from c in session.Query<Company>()
                                where c.Employees.Any(employee => employee.Name == "Ayende")
                                select c;
4

2 に答える 2