Denken Sie lokalisierte Texte, die in dieser Tabelle gespeichert sind:
Tabellentexte
Nun möchte ich einen Text für TextId 1 auswählen. Wenn es für diese TextId keinen Text in "Danish" gibt, möchte ich auf "English" zurückgreifen.
Ich könnte das so machen:
%Vor%... Aber ich muss den Rest der Where-Klausel wiederholen, was bedeutet, dass ich mich wiederhole (nicht so schlimm in diesem Beispiel, aber es könnten viel mehr Klauseln sein).
Gibt es einen einfacheren Weg, dies zu tun?
Ich würde vorschlagen, ein Filtermuster zu verwenden, in dem Sie Erweiterungsmethoden für IEnumerable schreiben. Auf diese Weise wird der Großteil Ihrer Logik in Methoden eingekapselt, die Sie immer wieder verwenden können:
%Vor%Ihr Code wird dann:
%Vor%Die Wiederholung wird dann zu einem Nicht-Problem. Ich würde auch vorschlagen, sich selbst eine statische Klasse zu machen, um die verschiedenen Sprachwerte zu halten, um die harte Codierung zu vermeiden:
%Vor%Ihr Code wird dann:
%Vor%Sie können dies mit der DefaultIfEmpty-Methode kombinieren, die Ihnen Folgendes bietet:
%Vor%Schließen Sie dann ab, indem Sie diese in eine einzelne Erweiterungsmethode zur Wiederverwendung einfügen:
%Vor%Sie können jetzt einfach anrufen:
%Vor%Beachten Sie, dass dies als letzter Schritt jeder Abfrage verwendet werden kann, damit auch so etwas funktioniert:
%Vor%Wie bereits erwähnt wurde, gibt es, wenn Sie zu mehreren Backup-Sprachen gehen, bessere Ansätze als das Überprüfen einer Sprache zur gleichen Zeit wie in der ursprünglichen Frage, aber dieses Filtermuster funktioniert sauber, es ist nur eine Frage der Definition des Rechts Filter für Ihren Anwendungsfall und Ihre Strategie.
Eine Lösung besteht darin, alle Texte der erforderlichen ID abzurufen und dann an einer Sprachpräferenzzuordnung teilzunehmen:
%Vor%Wenn Sie nur zwei Sprachen haben, können Sie dies noch einfacher machen und unnötige Zeilen vermeiden:
%Vor%Wenn Sie eine dynamische Anzahl von Sprachen unterstützen möchten, können Sie Ihren Prioritätsausdruck dynamisch erstellen (mit System.Linq.Expressions). Dies führt zu einem einzelnen Datenbankaufruf, der nur den einen Datensatz zurückgibt, den Sie möchten:
%Vor%Wenn es Ihr primäres Anliegen ist, die where-Klausel nicht zu wiederholen, besteht die einfachste Möglichkeit darin, Ihre where-Klausel aufzuteilen, etwa so:
%Vor%Wenn Sie garantieren können, dass Sie nur einen passenden Eintrag haben (was für eine Lokalisierungstabelle wahrscheinlich wahr ist), können Sie dies noch weiter vereinfachen (und das Ganze in eine Funktion zur einfacheren Wiederverwendung einbinden):
%Vor%