Ich habe eine Entitätssammlung von Readings
.
Jedes Reading
ist mit einer Entität namens Meter
verknüpft.
(Und jeder Meter
enthält mehrere Lesungen).
Jedes Reading
enthält ein Feld für die Meter-ID (int) und ein Feld für die Zeit.
Hier ist ein vereinfachter Code, um es zu demonstrieren:
%Vor% Gegeben ein bestimmter Zeitraum und eine Liste von meterid
s,
Was wäre der effizienteste Weg, um für jeden Meter zu bekommen
die erste und letzte Lesung in dieser Zeit?
Ich bin in der Lage, alle Meter und jeden Meter zu durchlaufen erste und letzte Lesung für den Zeitraum, aber ich war am wandern, wenn es einen effizienteren Weg gibt, dies zu erreichen.
Und eine Bonusfrage : dieselbe Frage, aber mit mehreren Zeitabschnitten, um Daten zu erhalten, statt nur einer Periode.
Ich bin mir nicht ganz sicher, wie Sie diese Daten haben wollen, aber Sie könnten sie in einen anonymen Typ projizieren:
%Vor%Sie können dann Ihre Ergebnisliste so lesen (dieses Beispiel ist nur als Illustration gedacht):
%Vor%Eine weitere Option wäre, Eigenschaften in Meter zu erstellen, die den ersten und letzten Messwert dynamisch zurückgeben:
%Vor%EDIT: Ich habe die Frage ein wenig missverstanden.
Hier ist die Implementierung zur Bestimmung der ersten und letzten Messwerte für einen Zähler einschließlich eines Datumsbereichs (angenommen meterIdList
ist ein ICollection<int>
der IDs und begin
und end
ist der angegebener Datumsbereich)
Sie können jetzt keine Eigenschaften mehr verwenden (da Sie Parameter angeben müssen), so dass die Methoden auch als Alternative funktionieren:
%Vor%Ich habe ein sehr ähnliches Datenmodell, in dem dieser Code verwendet wird, um die ältesten Messwerte zu erhalten, ich habe ihn so geändert, dass er auch die neuesten enthält.
Ich verwende die Abfragesyntax, um so etwas zu tun:
%Vor%Das würde zu einem einzigen neuen und ältesten Messwert für jeden Meter führen.
Der Grund, warum ich denke, dass dies effizient ist, liegt darin, dass es einen Blick auf die Datenbank gibt, um alle Messwerte für jeden Meter zu erhalten, anstatt mehrere Nachschlagevorgänge für jeden Meter. Wir haben ~ 40000 Meter mit ~ 30mil Lesungen. Ich habe gerade das Nachschlagen auf unseren Daten getestet, es dauerte ungefähr 10s
Das vorgeformte SQL ist ein Crossjoin zwischen zwei Subselects für jedes der Min- und Max-Daten.
UPDATE:
Da dies abfragbar ist, sollten Sie in der Lage sein, einen Zeitraum nach dem folgenden zu liefern:
%Vor%Oder lege es in die ursprüngliche Abfrage, ich mag es einfach so getrennt. Die Abfrage wird noch nicht ausgeführt, da wir noch keine Aktion ausgeführt haben, die die Daten noch abruft.
meine Lösung wird genau das zurückgeben, was Sie wollen (Liste aller Zähler, die Messwerte innerhalb eines bestimmten Zeitraums enthalten)
%Vor%Ich habe einige sehr gute Leads bekommen, danke an alle Antwortenden. Hier ist die Lösung, die für mich funktioniert hat:
%Vor%Tags und Links .net c# entity-framework linq linq-to-entities