3

所以这是我的情况,我得到了 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

language 包含大约 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 但没有好的结果。

4

2 回答 2

5

在我看来,实际上您的结构还不太正确:您应该有第三个 ResourceKeys 表,其中包含k1in。这样,当您添加资源键时,您添加的第一件事是 ResourceKeys 中的一个条目,此时所有语言都将缺少该翻译。否则,您将无法表示“没有翻译的资源”,这是一个有意义的 IMO 概念。

然后,您可以交叉加入语言和资源键,并针对资源进行分组加入:

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() };
于 2012-11-06T11:04:38.657 回答
1
from lang in context.Languages
where !context.Resources.Contains(r => r.LanguageId == lang.LanguageId)
select lang
于 2012-11-06T11:01:37.957 回答