所以这是我的情况,我得到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() };