クライアントJavaScriptにBreezejsを使用しています。フィルタ(where句)が適用されているBreezejs(IQueryableを使用するサーバー側)を使用している場合に、クエリの総数を取得する方法がわかりません。
4 に答える
v 0.75.1以降、新しい'inlineCount'メソッドをEntityQueryに追加しました。詳細については、breezeAPIのドキュメントをご覧ください。うまくいけば、これはあなたが必要とするものを提供するでしょう。
Enumerable.Countは、カウントだけでなく、dbからすべてのレコードをロードするため、Wardのソリューションに少し変更を加えました(これは、SQLプロファイラーを監視した後でわかりました)。
まず、IQueryable.Count拡張メソッドのラッパーを作成します(リフレクションを介して拡張メソッドを呼び出すことができないため)。
public static class QueryWrapper {
public static int Count<T>(IQueryable<T> query) where T: class {
return query.Count();
}
}
そして私たちは変更しました
if (actionExecutedContext.Request.RequestUri.Query.Contains("$inlinecount")) {
if (dQuery is IQueryable) {
inlineCount = Enumerable.Count(dQuery);
}
}
このコードで、
if (actionExecutedContext.Request.RequestUri.Query.Contains("$inlinecount")) {
if (dQuery is IQueryable) {
var method = typeof(QueryWrapper).GetMethod("Count");
var genericMethod = method.MakeGenericMethod(elementType);
inlineCount = (int)genericMethod.Invoke(null, new object[] { dQuery });
}
}
この変更後、Entity Frameworkはカウントのみを取得し、すべてのレコードを取得するわけではありません。
お役に立てれば。
良い1日を。
クエリでの$inlinecountのサポートは現在検討中です-投票してください。
更新:$ inlineCountはv.0.75.1の時点でBreezeにあり、この回答は廃止されています。
したがって、回避策を説明している回答を削除しました(回避策はUmutÖzelがここでの回答で改善しました)。新しい機能は、このSOの質問とすべての貢献によって推進されました。ありがとうございました。