这在LINQ中是否可行?

KAR*_*RAN 6 c# linq

是否可以仅返回匹配所有列表值的人LINQ

我有一个表klist,其中有两列可用:

Kid  -  Tableid  
001      1
001      2
002      1
003      3
004      1
004      2
Run Code Online (Sandbox Code Playgroud)

我有一个包含tid值的列表:

List<int> tid = new List<int>();
tid.Add(1);
tid.Add(2);
Run Code Online (Sandbox Code Playgroud)

现在tid列表中有1和2个值.

所以我的问题是,从klist表中我将只获得kid包含所有tid列表值并与表id进行比较的那些.

此后的预期结果是

kid - 001
kid - 004
Run Code Online (Sandbox Code Playgroud)

我尝试了以下查询:

var lb = Klist.Where(t => tid .Contains(t.Tableid)).Select(k => k.Kid).Distinct().ToList();
Run Code Online (Sandbox Code Playgroud)

但是返回所有匹配的孩子,如果即使是单一匹配,那么他们也会给出结果,但我只想要那些匹配所有表id和tid列表的人. 我的查询结果是

kid - 001
kid - 002
kid - 003
kid - 004
Run Code Online (Sandbox Code Playgroud)

LINQ为此建议一个查询.

Pie*_*ult 1

为了实现你想要的,你首先需要Group通过以下方式树立你的价值观Kid

Klist.GroupBy(k => k.Kid)
Run Code Online (Sandbox Code Playgroud)

结果是不同Kids 及其相应Tableids 的列表。

之后,我们需要选择所有Tableids 都与 s 相同的组tid。这可以通过从两个列表中删除相同的元素来实现,使用Except. 然后我们检查是否没有剩余元素(即两个集合相等)。

.Where(g => tid.Except(g.Select(s => s.Tableid)).Count() == 0)
Run Code Online (Sandbox Code Playgroud)

最后,获取剩余组的 ,在组中Kid存储为:Key

.Select(g => g.Key);
Run Code Online (Sandbox Code Playgroud)

如果我们将所有内容组装在一起,我们会得到以下 LINQ 查询:

var lb = Klist.GroupBy(k => k.Kid).Where(g => tid.Except(g.Select(s => s.Tableid)).Count() == 0).Select(g => g.Key);
Run Code Online (Sandbox Code Playgroud)

返回元素001004