带有AND或OR的LINQ,用于2个或更多可枚举列表

时间:2015-10-28 14:20:24

标签: c# linq

所以我有2个不同的列表,比如服务和组。组包含服务。我试图弄清楚他们之间的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;

这是我到目前为止所做的,似乎正在处理&#39;或&#39;它的方方面面,我无法绕过我的方式和#39;&#39;此

为清楚起见: 说我有Group1&amp; 2,Service1,2,&amp; 3. Group1有服务1&amp; 3. Group2有服务1&amp; 2.如果您选择了服务1和2,那么代码现在的方式就是获得两个组(或者,两个组都包含服务1,不一定是服务2)。我正在寻找一个只给我第2组的查询,因为它是唯一同时包含服务1和服务2的组

2 个答案:

答案 0 :(得分:1)

试试这个:

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

实际上你并不需要select new,这里有一个更好看的代码:

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

答案 1 :(得分:1)

以下是两种方法:

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