Linq:丢失记录

时间:2012-11-06 10:57:07

标签: c# .net linq lambda

所以继续我的情况我得到了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,但没有很好的结果。

2 个答案:

答案 0 :(得分:5)

我觉得你的结构实际上还不是很正确:你应该有一个ResourceKeys的第三个表,其中包含k1。这样当你添加一个资源键时,首先要添加的是在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() };

答案 1 :(得分:1)

from lang in context.Languages
where !context.Resources.Contains(r => r.LanguageId == lang.LanguageId)
select lang