Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Können wir die Reihenfolge der LINQ-Ausdrücke mit Skip(), Take() und OrderBy() steuern?

Meine Workaround-Lösung

Ich habe es geschafft, dieses Problem zu umgehen. Versteh mich hier nicht falsch. Ich habe das Vorrangproblem noch nicht gelöst, aber ich habe es gemildert.

Was habe ich getan?

Dies ist der Code, den ich verwendet habe, bis ich eine Antwort von Devart erhalte . Wenn sie dieses Problem nicht lösen können, muss ich am Ende diesen Code verwenden.

// 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();
}

Zunächst erhalte ich geordnete IDs meiner Entitäten. Das Abrufen nur von IDs ist auch bei größeren Datensätzen sehr leistungsfähig. Die MySQL-Abfrage ist recht einfach und funktioniert wirklich gut. Im zweiten Teil partitioniere ich diese IDs und verwende sie, um tatsächliche Entitätsinstanzen zu erhalten.

Wenn ich darüber nachdenke, sollte dies sogar noch besser funktionieren als zu Beginn (wie in meiner Frage beschrieben), da das Abrufen der Gesamtzahl aufgrund der vereinfachten Abfrage viel schneller ist. Der zweite Teil ist praktisch sehr ähnlich, außer dass meine Entitäten eher nach ihren IDs zurückgegeben werden, anstatt mit Skip partitioniert zu werden und Take ...

Hoffentlich findet jemand diese Lösung hilfreich.