H!
SQLデータベース上でNHibernateを使用するWebアプリケーションのロケールフォールバックを使用してメッセージストアをコーディングしています。たとえば、の結果はstore.Get("Greet", "fr-ca-on")
、このデータ(fr-ca
)からの最適な値になります。
Key Locale Message
----- ------ --------
Greet Hello
Greet fr Bonjour!
Greet fr-ca Âllo!
Greet fr-ca-qc Âllo toi!
フォールバックを実装するために、このようなさまざまなクエリを試しました。
string[] locales = new[] { "fr-ca-on", "fr-ca", "fr", "" };
return (
from Translation translation in reader.Get<Translation>()
where locales.Contains(translation.Locale)
group translation by translation.Key into translationGroup
select translationGroup.OrderByDescending(p => p.Locale.Length).First()
//or: select translationGroup.MaxBy(p => p.Locale.Length)
);
これらはメモリ内で非常にうまく機能しますが、NHibernateはグループ選択をSQLに変換できません。(selectではなく、のような単純な集計メソッドのみをサポートしているよう.Count()
です。)
NHibernateがクエリをSQLに変換できるように、このクエリを書き直すにはどうすればよいですか?クエリをメモリに早めに延期しない方法は考えられません。これは、アプリケーションのパフォーマンスを実際に損なうことになります。
(翻訳に関連する他のエンティティがあるため、リソースファイルは使用しません。)