我有两个表,一个是主实体,另一个是它在特定语言中的翻译记录
食谱
- ID|唯一标识符
RecipeTranslation
- ID|唯一标识符
- RecipeId|唯一标识符
- 语言代码|弦
- 姓名、名称|字符串
给定一个语言代码数组,有谁知道我将如何进行查询,在这个翻译表中搜索任何应该存在(但不存在)的记录。每个配方和语言代码应该有一个记录
我希望传递给SELECT查询的唯一参数是一个语言代码数组
伪代码类似于
- 对于每个配方
- 检查每个语言代码是否存在翻译记录
- 如果它不显示我的食谱id和语言代码对失踪
这是我目前的解决方案
var result = from ingredient in _dbContext.Ingredients
join translation in _dbContext.IngredientTranslations
on new { IngredientId = ingredient.Id, LanguageCode = "uk" } equals new { translation.IngredientId, translation.LanguageCode }
into ingredientTranslation
from x in ingredientTranslation.DefaultIfEmpty()
where x == null
select new { IngredientId = ingredient.Id, LanguageCode = "uk" };
字符串
我可以获取每种语言的代码。所以我只是在语言代码中循环,然后运行它来返回不存在的记录
2条答案
按热度按时间okxuctiv1#
这在原始SQL中很容易通过左连接和table-valued parameter来实现。
您需要在数据库中创建Table类型(仅一次)
字符串
现在,在你的sql中,你需要一个交叉联接和一个左外联接。交叉连接为配方和所需语言代码的每种可能组合创建一行。左外连接然后带来一个翻译 * 如果有一个 *。所以如果翻译的语言代码为空,那么就没有翻译。
我将告诉你使用QueryFirst,因为它是目前为止使用C#中TVP的最好方法。您也可以使用use dapper,或者通过构建table literal directly in you sql来完全避免TVP。
型
当你保存它的时候,你应该会看到一个生成的execute方法,就像这样…
型
现在,您只需为生成的方法提供所需语言代码的列表。
yr9zkbsy2#
如果这是您的应用程序的持续需求,并且您有一个LanguageCode表,则可以构建一个名为vwMissingTranslations的视图,非常类似于bbsimonbb概述的视图。然后,您可以在代码中使用Where子句中的LanguageCodes数组查询它。此视图还可用于获取所有缺失翻译的计数,或按语言或按配方获取缺失翻译的计数。