2

このクエリは最近まで私のために働いていました。これで、RavenDBに135のInstallationSummaryドキュメントがあります。開始時刻までに最新のものを取得する代わりに、ほとんど機能していますが、最後の2、3、最新のドキュメントはこのクエリから表示されません。間違ったクエリを実行していますか?OrderByDescendingとTakeをRavenDBで実行するために、知っておくべき別の方法はありますか?正しく照会できるものにドキュメント番号の制限はありますか?

注:これをデバッグしましたが、クエリは実際にグリッドに表示されているものを返します。クエリが実行されてからUIに表示されるまでの間に変換は行われません。

IEnumerable<InstallationSummary> installationSummaries =
  QueryAndCacheEtags(session => session.Advanced.LuceneQuery<InstallationSummary>()
  .Include(x => x.ApplicationServerId)
  .Include(x => x.ApplicationWithOverrideVariableGroup.ApplicationId)
  .Include(x => x.ApplicationWithOverrideVariableGroup.CustomVariableGroupId)
  .OrderByDescending(summary => summary.InstallationStart)
  .Take(numberToRetrieve)).Cast<InstallationSummary>().ToList();

このグリッドには、開始時間が2012年1月19日午後6時33分51秒を超える行がさらにいくつか表示されます。

ここに画像の説明を入力してください

編集:クエリからTake(numberToRetrieve)を削除しましたが、合計160のInstallationSummaryドキュメントのうち128しか取得していません。RavenDB Studioでは160個すべてを見ることができますが、クエリから返されるのは128個だけです。128 ... 128 ... 2の累乗...制限に達しましたか?

さて、私は128の制限に達したようです: http ://www.blogcoward.com/archive/2010/05/21/RavenDB-and-a-brief-design-philosophy-discussion-with-Ayende.aspx http://codeofrob.com/archive/2010/05/12/ravendb-basic-usage-considerations.aspx

しかし、なぜ?そこにTake()メソッドがあります。最新の50のドキュメントをどのように取得する必要がありますか?

ちょっとしたハックとして、以下のクエリは少なくとも最新のものを表示します。日付に関係なく、最新の50が欲しいので、それは私が望むものではありません。開始日から50を超えない限り、少なくとも最新のアイテムが表示されます。

using Raven.Client.Linq;

DateTime startDate = new DateTime(2012, 1, 18);

IEnumerable<InstallationSummary> installationSummaries =
QueryAndCacheEtags(session => session.Query<InstallationSummary>()
.Include(x => x.ApplicationServerId)
.Include(x => x.ApplicationWithOverrideVariableGroup.ApplicationId)
.Include(x => x.ApplicationWithOverrideVariableGroup.CustomVariableGroupId)                        
.Where(x => x.InstallationStart > startDate)
.OrderByDescending(summary => summary.InstallationStart)                        
.Take(numberToRetrieve)
).Cast<InstallationSummary>().ToList();

LuceneQueryからQueryだけに移行し、Where句を追加する必要がありました。

4

2 に答える 2

3

ついに本当の問題を解決した。

IEnumerable<InstallationSummary> installationSummaries =
    QueryAndCacheEtags(session => session.Query<InstallationSummary>()
       .Include(x => x.ApplicationServerId)
       .Include(x => x.ApplicationWithOverrideVariableGroup.ApplicationId)
       .Include(x => x.ApplicationWithOverrideVariableGroup.CustomVariableGroupId)                        
       .Where(x => x.InstallationStart > startDate)
       .OrderByDescending(summary => summary.InstallationStart)                        
       .Take(numberToRetrieve))
       .Cast<InstallationSummary>()
       .ToList();

QueryAndCacheEtags(..)関数のシグネチャはFunc<T>、ではなく、Expression<Func<T>>です。そしてそれは戻りIEnumerable<T>ませんIQueryable<T>

これにより、ステートメントがその時点でからIQueryable<T>に変換されます。IEnumerable<T>これは、RavenDBサーバーがクエリの最初の部分のみを処理し、フィルタリングや順序付けがないことを意味します。

残りのステートメントは、返される128個のアイテムにメモリ内で適用されます。したがって、アイテムが適切に注文またはフィルタリングされていないのはなぜですか。

ここここにもう少し情報があります

Func<T>通常、との違いについて心配する必要はありませんExpression<Func<T>>。コンパイラが自動的に処理します。ただし、独自の関数呼び出しをLINQステートメントに導入する場合は、それを正しく行う必要があります。

于 2012-01-29T15:19:04.763 に答える
1

RavenDBはデフォルトで結果整合性を使用するため、明示的に指定しない限り、インデックスが古くなる可能性があります。

以下の行(またはそのバリアントの1つ)をクエリに追加します。

  .Customize(x => x.WaitForNonStaleResultsAsOfNow())
于 2012-01-20T09:46:29.133 に答える