質問: `ef core`ローカライズされた`enum`によってデータを注文するためのベストプラクティスはありますか? 私のエンティティには多くの言語に翻訳できる`enum`ありますが、ユーザーが`enum`データを並べ替える場合は、インデックスではなくローカライズされた文字列で並べ替える必要があります。 クライアント評価を使用したくありません。より多くの言語をサポートする必要があるため、値の変換を使用できません。 何か提案はありますか?
回答: 列挙値をIDとして使用し、言語コードと翻訳用の追加フィールドを使用して、ソート順を強制するのではなく、ルックアップテーブルを使用します。翻訳と言語コードをインデックスでカバーする場合、翻訳された値によるソートとフィルタリングを高速に行うことができます。 列挙型はクライアント*言語の*概念であり、まれに変更されることを意図しています。ただし、データベースでは、値のリストはテーブルに格納されます。列挙値は、独自のテーブルに保存しない限り、マジック値として表示されます。 名前などの値以外のプロパティでデータ操作(並べ替えなど)を実行する必要がある場合、または値の数が頻繁に変化する場合は、列挙型をリレーショナルエンティティとしても扱う必要があります。 これは、翻訳管理を目的としたDbContextでない限り、DbContextで*ORMエンティティ*として表示する必要があるという意味ではありません。 * クエリと編集には異なるコンテキストを使用できます。ローカライズされた並べ替えは、通常、クエリのレポートに使用されます。グリッドにデータを表示することもレポートクエリです。これらの場合、メインテーブルをルックアップテーブルと結合し、言語によるフィルタリングと並べ替えを可能にするローカライズされたビューにエンティティをマップできます。 * 生のクエリを使用して、ルックアップ名を返す関数または生のクエリにマップし、追加のLINQ演算子を追加できます。 * EFコアインターセプターを使用して、クエリにルックアップロジックを追加できますが、これは異なるコンテキストを使用するよりも複雑です。 ただし、多くの言語をサポートする予定の場合は、データベースに格納されているデータの適切なローカリゼーション設計を検討する必要があります。