2016-04-12 20 views
0

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

+0

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

+0

Ich habe einen Dump und es scheint, wie die Ergebnisse gemischt werden, wenn Paging getan wird (IE. Resources.Skip (20) .Take (10). ToList()) – Raunio

+0

Ich glaube, ich habe das Problem behoben, indem ich resources.ToList() vor dem Paging, IE. 'resources.ToList(). Skip (20) .Take (10)' – Raunio

Antwort

0

können Sie https://expressprofiler.codeplex.com/ verwenden die SQL generieren, indem EF Kopie anzuzeigen und die SQL-Abfrage direkt in SQL Server Management Studio einfügen und schauen, wo die doppelte origine ist, können Sie Abfrage ändern, um doppelten Eintrag zu entfernen und nach Suche Linq verantwortlich. Sie können die SQL auch hier setzen

Verwandte Themen