私の回避策
私はこの問題をなんとか回避することができました。ここで誤解しないでください。優先順位の問題はまだ解決していませんが、軽減しました。
私がしたことは?
これは、 Devartから回答を得るまで使用してきたコードです。 。彼らがこの問題を克服できない場合は、最後にこのコードを使用する必要があります。
// get ordered list of IDs
List<int> ids = ctx.MyEntitySet
.Include(/* Related entity set that is needed in where clause */)
.Where(/* filter */)
.OrderByDescending(e => e.ChangedDate)
.Select(e => e.Id)
.ToList();
// get total count
int total = ids.Count;
if (total > 0)
{
// get a single page of results
List<MyEntity> result = ctx.MyEntitySet
.Include(/* related entity set (as described above) */)
.Include(/* additional entity set that's neede in end results */)
.Where(string.Format("it.Id in {{{0}}}", string.Join(",", ids.ConvertAll(id => id.ToString()).Skip(pageSize * currentPageIndex).Take(pageSize).ToArray())))
.OrderByDescending(e => e.ChangedOn)
.ToList();
}
まず、エンティティの順序付けされたIDを取得しています。 IDのみを取得すると、データセットが大きい場合でもパフォーマンスが向上します。 MySqlクエリは非常に単純で、非常に優れたパフォーマンスを発揮します。 2番目の部分では、これらのIDを分割し、それらを使用して実際のエンティティインスタンスを取得します。
考えてみると、クエリが簡略化されているため、合計数の取得がはるかに高速であるため、これは最初に行っていた方法よりもさらに優れたパフォーマンスを発揮するはずです(私の質問で説明)。 2番目の部分は、実際には非常によく似ていますが、エンティティがSkip
を使用してパーティション化されるのではなく、IDによって返される点が異なります。 およびTake
...
うまくいけば、誰かがこの解決策が役立つと思うかもしれません。