ich C# und Entity Framework 6.Linq Abfrage Wo() mit Datum Subtraktion zu viel Zeit nehmen
mit habe ich eine Einheit (Tier) in meiner Datenbank, die eine Liste von einem anderen Unternehmen (Feeding) hat an es. Der Feed-Entität ist eine DateTime zugeordnet.
Meine Abfrage sieht wie folgt aus:
var sum = animal.Feedings.Where(f => (DateTimeOffset.Now.Date- f.DateTime.Date).Days == 1).Select(f => f.Amount).Sum()
ich im Grunde die Summe der Gesamtfuttermenge von gestern wollen. Aber wenn mein Animal-Objekt eine erhebliche Menge an Fütterungen hat (sagen wir 5000, was erwartet wird und sogar noch höher sein könnte), dauert diese Linie mehr als 20 Sekunden.
Gibt es eine Möglichkeit, diese Codezeile effizienter zu gestalten?
BEARBEITEN Es scheint, dass das Fütterungsobjekt aus dem Tierobjekt lazy geladen wird.
var feedings = animal.Feedings
Diese Zeile benötigt jetzt die exzessive Zeit. Das Tierobjekt wurde ursprünglich aus einem AsQueryable() - Objekt erstellt, indem das Tier anhand einer ID ausgewählt wurde.
EDIT # 2 Diese Logik ist in dem Tiere Repository und kann nicht die DbContext zugreifen, kann es nur eine IQueryable der Tiersammlung zugreifen. Ich habe auch keinen Zugriff auf EFs Include() -Funktion, um zu versuchen, die Fütterungen mit der Abfrage zu integrieren.
Erstellen Sie Ansicht, UDF oder SP in db und wählen Sie dann aus der erstellten Abfrage. Auf diese Weise können Sie SQL-Performance –
wo genau ist die Verzögerung passiert. Auf der C# Ebene oder auf der DB-Ebene? Stellen Sie sicher, dass die Verzögerung nicht die DB ist, wenn dies der Fall ist, versuchen Sie, die Tabelle für Ihre linq-Abfrage (Indizes usw.) zu optimieren. – Milan
Wenn das 'Tier'-Objekt bereits geladen ist (wie es scheint), wird höchstwahrscheinlich die Zeit dafür genommen, die' Fütterungen'-Sammlung zu laden. Haben Sie 'var fedings = animal.Feedings;' versucht und sehen Sie, wie lange es dauert, und messen Sie dann die LINQ-Abfrage, die eine LINQ to Objects-Abfrage sein sollte, und 5K-Elemente sollten in Millisekunden ausgeführt werden. –