2017-02-16 5 views
0

文書上のアクティブなユーザを検索するRavenDBクエリがあります。RavenDBの子オブジェクトに関するすべてのクエリが不正な結果を返します

通常のクエリは次のようになります。

var documents = session.Query<Document>().Where(d => d.Users.Any(u => u.Id == UserId && u.Active == true)).ToList(); 

自動的に生成されたクエリは次のようになります。

from doc in docs.Documents 
select new { 
    Users_Active = (
     from docUsersItem in ((IEnumerable<dynamic>)doc.Users).DefaultIfEmpty() 
     select docUsersItem.Active).ToArray(), 
    Users_Id = (
     from docUsersItem in ((IEnumerable<dynamic>)doc.Users).DefaultIfEmpty() 
     select docUsersItem.Id).ToArray() 
} 

はしかし、これは、クエリが正しいユーザーを持つドキュメントを返すようになりますが、そのユーザは、ドキュメント上に別のアクティブユーザがいる限り、非アクティブである。

私はフィールドが結果として得られるインデックスが作成されているので、これは疑う:

AssignedUsers_Id: [1, 2] 
AssignedUsers_Active:[false, true] 

そしてクエリは、彼らは彼らの中に異なる指標であるにも関わらず、アクティブアレイでは、アレイ内のIDと一致し、そして真のだろうそれぞれのアレイ。

UserIdが正しい文書が返されるようにするには、どのような変更を行う必要がありますか?

今後自動的にインデックスが作成されないようにするには、LINQクエリを書き換えてインデックスを作成して正しく実行できるようにする方法はありますか?

答えて

1

これは、自動インデックスによる設計上の動作によるものです。独自のインデックスを定義することで、この動作を回避できます。独自のインデックスは、ドキュメントのユーザーごとにインデックスエントリを生成します。

これが自動インデックスのデフォルトの動作である理由は、大部分の場合、ユーザーには関係ありませんが、サーバー側では潜在的にコストが非常に高いため、ユーザーそれについて明確な決定を下す。

+0

サーバー側のパフォーマンスが高い場合は、通常のようにクエリの結果を受け入れて、代わりにC#で間違ったものをフィルタ処理する方が良いでしょうか? –

+0

いいえ、あなたが実際にそれを必要としている場合は、パーツコストは問題ありません。ほとんどの場合、インデックス作成が必要です。問題は、デフォルトでこれを行うと間違っているということです。 –

関連する問題