C# 对于2个或多个可枚举列表,使用AND或or的LINQ

C# 对于2个或多个可枚举列表,使用AND或or的LINQ,c#,linq,C#,Linq,所以我有两个不同的列表,比如服务和组。组包含服务。我想找出他们之间的linq连接。我有一个界面,允许用户选择一个或多个服务,我需要一个查询来选择其中包含所有选定服务的所有组,或者至少包含一个选定服务的所有组。通过无线电选择和/或区段 var servFilter = from cs in lstServices.CheckedItems.Cast<ListViewItem>() join ts in TotalServices on

所以我有两个不同的列表,比如服务和组。组包含服务。我想找出他们之间的linq连接。我有一个界面,允许用户选择一个或多个服务,我需要一个查询来选择其中包含所有选定服务的所有组,或者至少包含一个选定服务的所有组。通过无线电选择和/或区段

var servFilter = from cs in lstServices.CheckedItems.Cast<ListViewItem>()
                         join ts in TotalServices on cs.Tag equals ts.IDserv
                         join fg in groupSet on ts.IDpack equals fg.IDPack
                         select fg;
var servFilter=来自lstServices.CheckedItems.Cast()中的cs
将ts加入cs上的TotalServices。标记等于ts.IDserv
在ts.IDpack上的组集中加入fg等于fg.IDpack
选择fg;
到目前为止,这就是我所拥有的,而且似乎正在处理‘或’方面的问题,我只是不知道我会如何‘和’这个

为清楚起见: 假设我有组1和组2以及服务1、2和组3。组1有服务1和服务3。组2有服务1和服务2。如果您选择了服务1和服务2,那么现在代码的方式是您将得到两个组(Or,两个组都包含服务1,但不一定包含服务2)。我正在寻找一个只给我组2的查询,因为它是唯一一个同时包含服务1和服务2的组

 var query = (from g in groupSet
              join s in TotalServices on g.IDpack equals s.IDpack
              group new {s, g} by g into grp
              select new
              {
                 Group = grp.Key,
                 Services = grp
              }).Where(x => !lstServices.CheckedItems.Cast<ListViewItem>().Select(x1 => x1.Tag).Except(x.Services.Select(x2 => x2.Services.IDserv)).Any()).Select(a => a.Group).ToList();

以下是如何做到这两个方面:

var selectedServiceIds = lstServices.CheckedItems.Cast<ListViewItem>().Select(cs => cs.Tag);

var anySelected = groupSet.Where(fg => TotalServices.Any(
    ts => ts.IDpack == fg.IDPack && selectedServiceIds.Contains(ts.IDserv)));

var allSelected = groupSet.Where(fg => selectedServiceIds.All(
    id => TotalServices.Any(ts => ts.IDpack == fg.IDPack && ts.IDserv == id)));
var selectedServiceIds=lstServices.CheckedItems.Cast().Select(cs=>cs.Tag);
var anySelected=groupSet.Where(fg=>TotalServices.Any(
ts=>ts.IDpack==fg.IDpack&&selectedServiceIds.Contains(ts.IDserv));
var allSelected=groupSet.Where(fg=>selectedServiceIds.All(
id=>TotalServices.Any(ts=>ts.IDpack==fg.IDpack&&ts.IDserv==id));

代码中的“组”在哪里?@DLeh packFilter,刚刚编辑,以清晰地显示组设置您需要两个查询。所有的和至少一个都不能结合起来。@jdweng是的,我明白了,我只是不知道如何把and查询组合起来。加入只是给了我一个or,那么我如何加入才能得到“和”?你是说
Concat()
还是
Union()
将它们放在一个列表中?我将对此进行研究,但为了澄清,假设我有Group1和2,以及Service1、2和3。组1有服务1和服务3。组2有服务1和服务2。如果您选择了服务1和服务2,那么现在的代码方式将同时得到两个组(Or,两个组都包含服务1)。我正在寻找一个只给我组2的查询,因为它是唯一一个同时包含服务1和服务2的组。这似乎不起作用。只是不返回任何结果。组和服务是模型对象,而contains正在寻找一个ListViewItem,我动态地创建了它们,因此要使用contains,我必须与新创建的LVI进行比较,使用与其他LVI相同的约定(基本上只是控制标记中ID为的组的名称)。它似乎什么也找不到。servFilter.ToArray()只返回0个元素,无论我选择了多少个服务,或者它们属于哪个组。我最终能够让它在控制台应用程序中返回一些结果,但它仍然为我提供了两个组,而不是一个(或条件)。我很乐意提供帮助,但我做了一些改进。你应该去看看,这种方法很有效。经过一些测试,我看到了:如果我有:G1-S1,S3 G2-S1,S2 G3-S1,S2,S3 SelectedService=1,2给出:G2预期:G2,G3选择服务=1,3给出:G1预期:G1,G3选择服务=1,2,3给出:G1,G2,G3预期:G3SelectedService=2,3给出:null预期:G3@ZexksMarquise是 啊我把情况弄得有点乱。请参阅更新,它很简单且不言自明-为了包含该组,每个选定的项目都必须为该组提供相应的服务。
var selectedServiceIds = lstServices.CheckedItems.Cast<ListViewItem>().Select(cs => cs.Tag);

var anySelected = groupSet.Where(fg => TotalServices.Any(
    ts => ts.IDpack == fg.IDPack && selectedServiceIds.Contains(ts.IDserv)));

var allSelected = groupSet.Where(fg => selectedServiceIds.All(
    id => TotalServices.Any(ts => ts.IDpack == fg.IDPack && ts.IDserv == id)));