Ich weiß, dass dies ein alter Thread ist, aber ich möchte noch einige Verbesserungen für jemanden auf der Suche nach der gleichen Lösung veröffentlichen.
1.Netzwerkredundanz
Ids auswählen und dann eine Abfrage ausgeführt wird, dass lädt Elemente mit dem Ids redundant ist und die gleiche Wirkung kann durch einfaches Ausführen dieses
Lösung erreicht werden:
var userNotifications = _context.Notifications
.OrderByDescending(n => n.DateTime)
.Skip(offset)
.Take(limit)
.OfType<NotificationUser>()
.Include(n => n.TargetUser)
.Include(n => n.TargetUser.Images)
.ToList();
Auf diese Weise, Sie warten nicht auf 2 DB-Verbindungen, sondern nur auf eine. Außerdem sparen Sie Traffic.
2. Paging auf ignorierten Entitäten?
Man würde annehmen, dass diese spezifische Methode nur für die Betrachtung von Entitäten eines geerbten Typs verwendet wird. Ich würde also erwarten, dass Skip and Take direkt nur an Entitäten dieses Typs arbeitet. z.B. Ich möchte 10 NotificationUsers überspringen, nicht 10 User (von denen nur 4 NotificationUsers sind).
Lösung: Verschieben ofType höher die Abfrage
var userNotifications = _context.Notifications
.OfType<NotificationUser>()
.OrderByDescending(n => n.DateTime)
.Skip(offset)
.Take(limit)
.Include(n => n.TargetUser)
.Include(n => n.TargetUser.Images)
.ToList();
3. Async/Await
Wenn eine API zu schreiben, können Sie über die Verwendung von Asynchron/erwarten wie das denken sollte nicht blockiert die Thread verschwendet also weniger Ressourcen (das wird wahrscheinlich erfordern, dass Sie viel von Ihrem existierenden Code umschreiben, wenn Sie ihn nicht bereits benutzen).
Bitte studieren Sie die Vorteile von async/await und verwenden Sie sie in Szenarien wie Warten auf ein Ergebnis.
Lösung: Ändern Sie diese
private List<NotificationUser> GetNotificationUsers(int offset, int limit)
{
return _context.Notifications
.OfType<NotificationUser>()
.OrderByDescending(n => n.DateTime)
.Skip(offset)
.Take(limit)
.Include(n => n.TargetUser)
.Include(n => n.TargetUser.Images)
.ToList();
}
in diesem
private async Task<List<NotificationUser>> GetNotificationUsersAsync(int offset, int limit)
{
return await _context.Notifications
.OfType<NotificationUser>()
.OrderByDescending(n => n.DateTime)
.Skip(offset)
.Take(limit)
.Include(n => n.TargetUser)
.Include(n => n.TargetUser.Images)
.ToListAsync();
}
HINWEIS: Sie müssen auch dann an jedem Ort ändern, die diese Methode von
verwendet
var x = GetNotificationUsers(skip, take);
zu
var x = await GetNotificationUsersAsync(skip, take);
Und diese Methode Asynchron machen und eine Aufgabe zurückkehren und
Nicht context.Notifications.Include Arbeit (‚TargetUser‘) sieht aus wie es einige allgemeine Fehler ist. Du hast gesagt, dass es eine Ausnahme gibt? Kann ich es sehen? –
@AlexanderHaas, versucht, Code mit Include erneut auszuführen und Eigenschaft wurde korrekt geladen. Scheint so, als hätte ich einen Grammatikfehler. Danke trotzdem! – Ivvan
@AlexanderHaas, Ok, es funktioniert nicht. Ich habe nicht bemerkt. OfType() in meiner Abfrage. Ohne es hat es eine Ausnahme geworfen. Aktualisierte Frage mit Nachricht. –
Ivvan