LINQ - Wie erhalten Sie das Minimum, wenn Wert = 0, den nächsten Wert erhalten
-
25-10-2019 - |
Frage
Ich habe eine Testdatenbank, in der Daten angepasst werden, wenn ein Store auf einem Store -Portal protokolliert wird und wie lange sie angemeldet bleiben.
Beispiel: (Nur zum Visualisierungszweck - nicht zur tatsächlichen Datenbank)
Stores
Id Description Address City
1 Candy shop 43 Oxford Str. London
2 Icecream shop 45 Side Lane Huddersfield
Connections
Id Store_Ref Start End
1 2 2011-02-11 09:12:34.123 2011-02-11 09:12:34.123
2 2 2011-02-11 09:12:36.123 2011-02-11 09:14:58.125
3 1 2011-02-14 08:42:10.855 2011-02-14 08:42:10.855
4 1 2011-02-14 08:42:12.345 2011-02-14 08:50:45.987
5 1 2011-02-15 08:35:19.345 2011-02-15 08:38:20.123
6 2 2011-02-19 09:08:55.555 2011-02-19 09:12:46.789
Ich muss verschiedene Daten aus der Datenbank abrufen. Ich habe bereits die maximale und durchschnittliche Verbindungsdauer bekommen. (Wahrscheinlich sehr selbstverständlich, dass ich auch einige Informationen darüber haben muss, welche Verbindung am wenigsten dauert. Ich habe sofort an die min () -Funktion von linq nachgedacht, aber wie Sie sehen, enthält die Datenbank auch Verbindungen, die sofort begonnen und beendet wurden. Daher sind diese Daten für die Datenanalyse nicht "gültig".
Meine Frage ist also, wie Sie den Mindestwert erhalten, aber wenn der Wert = 0, erhalten Sie den nächsten Wert, der am niedrigsten ist.
Meine linq -Abfrage bisher (was die Funktion min () implementiert):
var min = from connections in Connections
join stores in Stores
on connections.Store_Ref equals stores.Id
group connections
by stores.Description into groupedStores
select new
{
Store_Description = groupedStores.Key,
Connection_Duration = groupedStores.Min(connections =>
(SqlMethods.DateDiffSecond(connections.Start, connections.End)))
};
Ich weiß, dass es möglich ist, die gültigen Werte durch mehrere Abfragen und/oder Aussagen zu erhalten, aber ich habe mich gefragt, ob es möglich ist, alles in nur einer Abfrage zu tun, da mein Programm erwartet das Programm so "leicht" wie möglich.
Wenn Sie dazu eine großartige/einfache Methode müssen, teilen Sie es bitte mit. Ihr Beitrag wird sehr geschätzt! :)
Lösung
var min = from connections in Connections.Where(connections => (SqlMethods.DateDiffSecond(connections.Start, connections.End) > 0)
join stores in Stores
on connections.Store_Ref equals stores.Id
group connections
by stores.Description into groupedStores
select new
{
Store_Description = groupedStores.Key,
Connection_Duration = groupedStores.Min(connections =>
(SqlMethods.DateDiffSecond(connections.Start, connections.End)))
};
Versuchen Sie dies, wenn Sie die "0" -Werte filtern, erhalten Sie das richtige Ergebnis, zumindest ist dies mein gelehrtes.
Andere Tipps
Was ist, wenn Sie vor dem neuen Neuen eine LET -Klausel für die Dauer der Konektion mit so etwas wie:
let duration = SqlMethods.DateDiffSecond(connections.Start, connections.End)
Und fügen Sie dann eine Where -Klausel hinzu
where duration != 0
Fügen Sie eine Where -Klausel vor, bevor Sie den min -Wert berechnen.
groupedStores.Where(conn => SqlMethods.DateDiffSecond(conn.Start, conn.End) > 0)
.Min(conn => (SqlMethods.DateDiffSecond(conn.Start, conn.End))