所以这是我的情况,我得到2张桌子,一张桌子有语言,一张桌子有资源,我想做的就是找到每种语言缺少的所有资源...

我想使用的默认语言是languageId = 1

表“资源”

Id    Key    Value    LanguageId
1     k1     test     1
2     k1     test     2
3     k1     test     3


表“语言”

Id
1
2
3
4
5
6
7


语言包含大约10行语言。

现在我想做的就是去掉那些存在的资源
(结果)

Key   Value   LanguageId
k1    test    1
k1    test    2
k1    test    3
k1    null    4
k1    null    5
k1    null    6
k1    null    7


香港专业教育学院尝试与GroupJoin和SelectMany有关解决此问题的任何建议,但效果不佳。

最佳答案

在我看来,您的结构实际上还不太正确:您应该有一个带有k1的ResourceKeys的第三张表。这样,当您添加资源键时,首先要添加的是ResourceKeys中的一项,这时所有语言都将缺少该翻译。否则,您将无法表示“没有翻译的资源”,这是IMO的一个有意义的概念。

然后,您可以交叉联接Language和ResourceKey,并针对Resources进行分组联接:

var query = from language in Languages
            from resourceKey in ResourceKeys
            join resource in Resources
                 on new { LangId = language.Id, ResId = resourceKey.Id }
                 equals new { LangId = resource.LanguageId,
                              ResId = resource.Key }
                 into values
            select new { LangId = language.Id,
                         ResId = resourceKey.Id,
                         Value = values.SingleOrDefault() };

10-01 19:59