sql >> データベース >  >> RDS >> Mysql

Skip()、Take()、およびOrde​​rBy()を使用してLINQ式の順序を制御できますか?

    私の回避策

    私はこの問題をなんとか回避することができました。ここで誤解しないでください。優先順位の問題はまだ解決していませんが、軽減しました。

    私がしたことは?

    これは、 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 ...

    うまくいけば、誰かがこの解決策が役立つと思うかもしれません。



    1. 自作のmysqlインストールの場合、my.cnfはどこにありますか?

    2. MySQLから友達の名前のリストを取得する

    3. Mysql:外部キーを持つ2つのテーブルの行を削除します

    4. node-mysqlのSQLクエリに変数を挿入する