所以我有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的组
答案 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)));