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