C# Linq:获取丢失的记录

C# Linq:获取丢失的记录,c#,.net,linq,lambda,C#,.net,Linq,Lambda,这是我的例子,我得到了两个表,一个是语言表,一个是资源表,我想做的是找到每种语言上缺少的所有资源 我想使用的默认语言是languageId=1 表格“资源” 表格“语言” 语言包含大约10行语言 现在我想做的是去掉那些dosent存在的资源 (ex结果) 任何关于如何解决这个问题的建议,我都尝试过GroupJoin,并选择了许多,但效果不佳。我觉得实际上您的结构还不太正确:您应该有第三个ResourceKey表,其中包含k1。这样,当您添加一个资源键时,您添加的第一件事就是ResourceKey

这是我的例子,我得到了两个表,一个是语言表,一个是资源表,我想做的是找到每种语言上缺少的所有资源

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

表格“资源”

表格“语言”

语言包含大约10行语言

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


任何关于如何解决这个问题的建议,我都尝试过GroupJoin,并选择了许多,但效果不佳。

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

from lang in context.Languages
where !context.Resources.Contains(r => r.LanguageId == lang.LanguageId)
select lang
然后,您可以交叉连接语言和资源键,并根据资源分组连接:

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() };

您有两个类似于上面的DataTable或数据库中的DataTable?是的,我取出languageid为1的单独表的资源键,因为这是出现最多的键,或者是应该始终存在的默认键。刚打印出来的问题似乎你的linq会解决问题。
Key   Value   LanguageId
k1    test    1
k1    test    2
k1    test    3
k1    null    4
k1    null    5
k1    null    6
k1    null    7
from lang in context.Languages
where !context.Resources.Contains(r => r.LanguageId == lang.LanguageId)
select lang
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() };