Ich habe einen Ausdruck, der DbFunctions
-Klasse verwendet, um Daten zu berechnen. Es funktioniert gut für linq-to-entities
, aber ich möchte diesen Ausdruck für Nicht-DB-Funktionalität wiederverwenden. Ist es möglich, zu erkennen, ob Ausdruck im Db-Kontext ausgewertet wird oder nicht, und entsprechende Implementierung zu verwenden? Ich habe Lösungen für Komponententests gesehen, die Mock-Objekte beinhalten, aber ich brauche diesen Ausdruck in der üblichen Geschäftslogik, damit Mocks nicht wie eine gute Lösung aussehen.DbFunctions zu einer non-db-Implementierung je nach Kontext wechseln
Hier ist mein Ausdruck:
public static Expression<Func<Transaction, bool>> Expired(int expirationPeriod)
{
return s => s.Status == Status.Created && DbFunctions.AddMinutes(s.UpdateDateUTC, expirationPeriod) < DateTime.UtcNow;
}
Ich möchte in der Lage sein, so etwas zu tun:
public static Expression<Func<Transaction, bool>> Expired(int expirationPeriod)
{
return s => s.Status == Status.Created && MyCustomResolver.AddMinutes(s.UpdateDateUTC, expirationPeriod) < DateTime.UtcNow;
}
wo MyCustomResolver
wird je nach Kontext entweder DbFunctions
oder DateTime
Implementierung verwenden.
Das Problem ist, dass innerhalb Ausdruck habe ich keine Informationen, wenn es für db aufgerufen wird oder nicht, so ist die Frage, wie man den tatsächlichen Kontext (diese 'amIUsingDB' Wert) erkennen, ohne es jedes Mal explizit übergeben – Random
Was" warum " , die tatsächlichen Ausdrücke sind komplizierter und Es sieht für mich wie ein Overhead aus, dass ich jedes Mal zwei separate Implementierungen für den db- und den non-db-Kontext schreibe. Daher frage ich mich, ob ich die richtige Implementierung bestimmter Methoden (wie 'AddMinutes') auswählen kann, wenn ein Ausdruck vom tatsächlichen Kontext abhängt . – Random
@Random Genau - zu beiden Kommentaren. Deshalb habe ich die Auswertung von 'amIUsingDB' * außerhalb * der Funktion verschoben. Sie setzen 'MyCustomResolver' einmal auf den Resolver, den Sie benötigen, um diese Informationen zu kennen, und sich dann nie wieder darum zu kümmern. Beachten Sie, dass damit die "Expired" -Methode, die Sie in Ihrer Frage angeben, so funktioniert, wie Sie möchten. –