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! :)

War es hilfreich?

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))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top