linq C# SQL检查应该存在的记录

juzqafwq  于 2023-07-31  发布在  C#
关注(0)|答案(2)|浏览(113)

我有两个表,一个是主实体,另一个是它在特定语言中的翻译记录
食谱

  • 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" };

字符串
我可以获取每种语言的代码。所以我只是在语言代码中循环,然后运行它来返回不存在的记录

okxuctiv

okxuctiv1#

这在原始SQL中很容易通过左连接和table-valued parameter来实现。
您需要在数据库中创建Table类型(仅一次)

CREATE TYPE dbo.Codes AS TABLE  
    ( Code nvarchar(50) )

字符串
现在,在你的sql中,你需要一个交叉联接和一个左外联接。交叉连接为配方和所需语言代码的每种可能组合创建一行。左外连接然后带来一个翻译 * 如果有一个 *。所以如果翻译的语言代码为空,那么就没有翻译。
我将告诉你使用QueryFirst,因为它是目前为止使用C#中TVP的最好方法。您也可以使用use dapper,或者通过构建table literal directly in you sql来完全避免TVP。

-- queryfirst
-- designTimeSection
declare @RequiredLanguageCodes Codes;
-- endDesignTimeSection

SELECT R.Id, RLC.Code
FROM Recipe R
cross join @RequiredLanguageCodes RLC
left outer join RecipeTranslations RT on R.Id = RT.RecipeId and RLC.Code = RT.LanguageCode
WHERE RT.LanguageCode is null


当你保存它的时候,你应该会看到一个生成的execute方法,就像这样…

public List<MyQfDto> Execute(IEnumerable<Codes> requiredLanguageCodes)
...

public class Codes{
    public System.String Code{get; set;}
}


现在,您只需为生成的方法提供所需语言代码的列表。

yr9zkbsy

yr9zkbsy2#

如果这是您的应用程序的持续需求,并且您有一个LanguageCode表,则可以构建一个名为vwMissingTranslations的视图,非常类似于bbsimonbb概述的视图。然后,您可以在代码中使用Where子句中的LanguageCodes数组查询它。此视图还可用于获取所有缺失翻译的计数,或按语言或按配方获取缺失翻译的计数。

相关问题