Entity Framework Rätsel

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von kilianhopf.

    Entity Framework Rätsel

    Hallo liebe Community,

    ich habe schon ein bisschen ein schlechtes Gewissen, weil ich mich immer nur bezüglich meines eigenen Krams melde und hier bisher sehr wenig für andere gegeben habe.

    ..dennoch traue ich mich heute mal wieder mit einer Frage an Euch :whistling: :

    Ich benutze das Entity-Framework und habe vor mir aus einer SQL-DB die Anzahl der Einträge zu der aktuellen Uhrzeit ausgeben zu lassen. Die Uhrzeit liegt dort als time(0) vor (im EF zu einer TimeSpan umgewandelt). Mein Code sah bisher aus wie folgt:

    C#-Quellcode

    1. label1.Text = (Convert.ToString(context.TriggerUhrzeits.Where(p => p.Uhrzeit.Hours == DateTime.Now.Hour && p.Uhrzeit.Minutes == DateTime.Now.Minute).Count()));


    der Count lag hierbei countinuierlich bei 0, obgleich zu der aktuellen Uhrzeit Datensätze vorhanden waren und die Integer-Values übereinstimmten. Sekunden habe ich zur Vereinfachung bewusst erst einmal weggelassen.

    gelöst habe ich das ganze nun wie folgt:

    C#-Quellcode

    1. int hour = DateTime.Now.Hour;
    2. int minute = DateTime.Now.Minute;
    3. label1.Text = (Convert.ToString(context.TriggerUhrzeits.Where(p => p.Uhrzeit.Hours == hour && p.Uhrzeit.Minutes == minute).Count()));


    meines Erachtens ist das codetechnisch das gleiche, aber funktional macht es offensichtlich doch einen Unterschied.

    Kann mir einer von Euch schlauen Köpfen eventuell erklären, wodurch bedingt dieses (in meinen Augen) Phänomen zu Stande kommt? Ich kann es mir bisher nicht erklären und wüsste auch nicht wie ich danach googlen sollte.. :/

    Vielen Dank schon mal an alle die sich Zeit hierfür nehmen! :) Hohe Priorität hat es definitiv nicht.. ;)

    kilianhopf schrieb:

    Sekunden habe ich zur Vereinfachung bewusst erst einmal weggelassen.
    Hmm- Das wäre halt mein einziger Erklärungs-Ansatz: Dass die Query mehr als 1s dauert, und daher sich die Bedingung während Ausführung der Query ändert - mit natürlich recht unvorhersehbaren Ergebnissen.
    Aber bei Minuten sollte sich doch zumindest dann und wann ein Datensatz finden lassen, tät ich denken.
    Aber wie gesagt: Generell keine gute Idee, bei Vergleichen innerhalb von Linq-Ausdrücken veränderliche Vergleichs-Parameter einzubauen, also dein 2. Code ist definitiv wesentlich besser - auch lesbarer.
    Kann man aber noch lesbarer formulieren:

    C#-Quellcode

    1. var now=DateTime.Now;
    2. label1.Text = context.TriggerUhrzeits.Where(p => p.Uhrzeit.Hours == now.Hour && p.Uhrzeit.Minutes == now.Minute).Count().ToString();
    Beachte: wenig Variablen, wenig Klammern hilft Code lesbarer zu machen.
    (kurze Zeilen wär noch schöner, und weniger Zeilen noch noch schöner, aber einen Tod muss man sterben, also da muss man beim Formulieren abwägen)