Effiziente LINQ to Entities-Abfrage

9

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.

    
omer schleifer 27.05.2013, 06:02
quelle

7 Antworten

3

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)

%Vor%

Sie können jetzt keine Eigenschaften mehr verwenden (da Sie Parameter angeben müssen), so dass die Methoden auch als Alternative funktionieren:

%Vor%     
davenewza 27.05.2013, 07:32
quelle
1

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.

    
FRoZeN 27.05.2013 09:25
quelle
0

Erstellen Sie eine neue Klasse als Rückgabetyp namens Result , der wie folgt aussieht

%Vor%

Ich habe Ihre Situation nachgebildet, indem ich eine Liste von Messgeräten erstellt und einige Daten gefüllt habe. Ihre Abfrage sollte jedoch ziemlich identisch sein

%Vor%     
James 27.05.2013 07:33
quelle
0
%Vor%     
Jan P. 27.05.2013 07:34
quelle
0
%Vor%

Wenn Sie viele Messwerte pro Meter haben, wird dies nicht gut funktionieren, und Sie sollten prüfen, dass Reads der SortedList-Klasse angehören.

    
Tormod 27.05.2013 07:45
quelle
0

meine Lösung wird genau das zurückgeben, was Sie wollen (Liste aller Zähler, die Messwerte innerhalb eines bestimmten Zeitraums enthalten)

%Vor%     
Ashok Damani 27.05.2013 08:28
quelle
0

Ich habe einige sehr gute Leads bekommen, danke an alle Antwortenden. Hier ist die Lösung, die für mich funktioniert hat:

%Vor%     
omer schleifer 28.05.2013 08:37
quelle