我有一个奇怪的要求。简而言之,我有一个产品表和一个语言表。每个产品都包含一个字符串的描述,用英语表示。在我的应用程序中,我需要以用户确定的15种语言之一显示描述。每个产品都包含一个IDictionary<Language, String>
,其中包含按语言编制索引的本地化描述。所有产品都有英文描述,但并非所有产品在某个时间点都被翻译成所有15种语言。
奇怪的要求是:对于给定的产品,如果翻译的产品描述不存在于用户的语言中,则回退到英语。
如上所述,这可能看起来并不那么奇怪,但我正在努力解决这个问题。在几次错误的启动之后,我在SQL中创建了一个基本上创建ProductId
和LanguageId
的交叉连接(笛卡尔积)并与转换表连接两次的视图,一次用于所有翻译,一次用于一个英文子查询。从这里,我使用COALESCE()提取翻译,以获得产品和语言代码的每个组合的翻译,必要时用英语。因此,此视图中的列基本上是ProductId
,LanguageId
和Translation
。
我如何映射?最重要的是,我该如何查询?我只需要能够从这个视图中读取数据。
显然这有点复杂。还有更好的方法吗?
答案 0 :(得分:1)
会这样吗?
<class name="Product" table="products">
<id name="Id">
<generator class="native"/>
</id>
<property name="Description" />
<map name="LocalizedDescriptions" table="descriptions">
<key column="product_id"/>
<index column="language" type="String" />
<element column="description" type="String" />
</map>
</class>
关于这种情况,用户语言中没有描述,只需检查条目是否在字典中即可。
public string GetDescription(string language)
{
return LocalizedDescriptions.ContainsKey(language) ? LocalizedDescriptions[language] : Description;
}