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;