4 Stimmen

Wie übermitteln LINQ-Abfragen gegen das Entity Framework Daten an einen SQL Server?

Ich verwende zwei LINQ-Abfragen für den Zugriff auf meine Datenbank mit Entity Framework:

Die erste speichert ein Token in der Datenbank und gibt ihm eine Zeitspanne von 60 Sekunden:

string tokenHash = GetTokenHash();
Token token = new Token()
{
    Client = client,
    Expiry = DateTime.Now.AddSeconds(60),
    UserId = userId,
    TokenHash = tokenHash,
};
context.AddToToken(token);
context.SaveChanges();

Der zweite sucht nach einem passenden Token, das noch nicht abgelaufen ist:

var item = (from t in datasource.SmsToken
            where t.Client.Id == clientId
            && t.UserId == userId
            && t.TokenHash == tokenHash
            && t.Expiry > DateTime.Now
            select t);
bool success = item.Count() >= 1;

Das Problem, das ich habe, ist, dass dies auf einem Testserver perfekt funktioniert hat. Jetzt, wo es auf eine andere Umgebung verschoben wurde, funktioniert es nicht mehr.

Ich habe eine Menge von Debug-Informationen und alles scheint zu entsprechen. Wenn ich die t.Expiry > DateTime.Now Zustand, funktioniert es gut. Das Problem liegt also im Datumsvergleich.

Der neue Server wurde mit einem anderen Datumsformat und anderen Globalisierungseinstellungen in Windows eingerichtet. Ich nehme an, dass dies das Problem ist, und das verwirrt mich.

Ich hätte gedacht, dass die Daten mithilfe von LINQ und EF konsistent gespeichert und abgerufen werden würden. Ich sollte damit keine Formatierungsprobleme haben, oder? Kann mir jemand sagen, was hier schief läuft?


Aktualisierung:

Interessanterweise erhalte ich das richtige Verhalten, wenn ich den Abrufcode durch den folgenden ersetze:

var item = (from t in datasource.SmsToken
            where t.Client.Id == clientId
            && t.UserId == userId
            // && t.TokenHash == tokenHash
            // && t.Expiry > DateTime.Now
            select t).ToList();

var matchingToken = (from t in item
                     where t.TokenHash == tokenHash
                     && t.Expiry > DateTime.Now
                     select t).FirstOrDefault();

bool success = matchingToken != null;

Das deutet für mich darauf hin, dass das Problem mit Datumsvergleichen innerhalb von Linq-to-Entities zu tun hat. Linq-to-objects funktioniert einwandfrei!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X