Ich erstelle derzeit eine ASP.NET Web App Suchergebnisseite. Ich habe verschiedene Arten der Sortierung für Benutzer implementiert, aber einige von ihnen geben unerwartete Ergebnisse.Entity Framework Paging und Sortierung führt zu unerwarteten Ergebnissen
Diese beiden Codezeilen sind unabhängig von der Art Sortierung ausgeführt oder anderen Faktoren:
var resources = ctx.Resource.Where(p => p.CityAlias == city.ToLower() && p.Company.Hidden != true && p.State == 1);
FilterResources(ref resources, resourceTypeId, serviceId);
FilterResources:
private void FilterResources(ref IQueryable<Resource> allRes, int resourceType, int selectedService)
{
allRes = allRes.Where(p => p.ResourceType_Id == resourceType && p.ResourceService.Any(x => x.Service_Id == selectedService));
}
Resource.ResourceService ist vom Typ ICollection, die auf einen zugeordneten ist Datenbanktabelle mit demselben Namen mit einem Fremdschlüssel, der auf Resource.Id verweist
So weit so gut. Zuerst wird ein Arbeits Art Beispiel:
private void SortResourcesByName(ref IQueryable<Resource> resources)
{
resources = resources.OrderBy(p => p.Name);
}
Dann behandeln wir Paging:
int count = resources.Count();
var resourceList = resources.Skip((page - 1) * 10).Take(10).ToList();
Dieser Satz von Entitäten korrekt und in der richtigen Reihenfolge zu sein scheint, aber hier ist, wenn die Dinge seltsam erhalten:
Wenn wir eine andere Sortierung verwenden, haben einige der Seiten doppelte Ergebnisse und in einigen Fällen, wenn ich durch die Seiten gehe, kann ich doppelte (oder mehr) Ressourcen auf der Liste verstreut sehen.
Zum Beispiel:
private void SortResourcesByPrice(ref IQueryable<Resource> resources, int serviceId)
{
resources = resources.OrderByDescending(p => p.ResourceService.FirstOrDefault(s => s.Service_Id == serviceId).Price.Value)
.ThenByDescending(p => p.Company.CompanyService.FirstOrDefault(c => c.ServiceId == serviceId).Price.Value);
}
Wenn ich diese Art verwenden, die erste Seite der Ansicht ist richtig, aber wenn ich auf andere Seiten der Navigation beginnen, fange ich doppelte Ergebnisse zu sehen.
Die Abfrage gibt knapp über 200 Ergebnisse zurück, die auf 21 Seiten aufgeteilt sind. Die Seiten 3 und 4 sind aus irgendeinem Grund genau gleich, die Seiten 5 und 6 ergeben ebenfalls dieselben Ergebnisse. In diesen Fällen ist ResourceService.Price = null.
Bonus Seltsamkeit: mit OrderBy() anstelle von OrderByDescending gibt keine doppelten Ergebnisse
private void SortResourcesByPrice(ref IQueryable<Resource> resources, int serviceId)
{
resources = resources.OrderBy(p => p.ResourceService.FirstOrDefault(s => s.Service_Id == serviceId).Price.Value)
.ThenBy(p => p.Company.CompanyService.FirstOrDefault(c => c.ServiceId == serviceId).Price.Value);
}
ich bei einem Totalverlust bin hier, also würde ich wirklich Hilfe zu schätzen wissen. Wenn Sie meinen Beispielcode nicht verstehen oder die Frage nicht auf andere Weise verstehen können, würde ich gerne versuchen, weitere Informationen bereitzustellen.
Edit: Ich möchte hinzufügen, dass die Menge der Ergebnisse/Ressourcen immer gleich ist, egal welche Art ich verwende (so wie es soll).
Edit 2: einige Zahlen Feste & Fehler
Machen Sie einen Dump von Ressourcen mit Ressourcen.ToList() in verschiedenen Schritt zu zeigen, was Ihre Ressourcen enthält und wenn das doppelte Ergebnis erscheint – ArDumez
Ich habe einen Dump und es scheint, wie die Ergebnisse gemischt werden, wenn Paging getan wird (IE. Resources.Skip (20) .Take (10). ToList()) – Raunio
Ich glaube, ich habe das Problem behoben, indem ich resources.ToList() vor dem Paging, IE. 'resources.ToList(). Skip (20) .Take (10)' – Raunio